このセクションでは、時間値の処理に使用できる関数について説明します。各日付日時型が持つ値の範囲、および値を指定する際の有効な書式については、セクション11.3「日付と時間型」を参照してください。
表 12.13 日付/時間関数
名前 | 説明 |
---|---|
ADDDATE() |
日付値に時間値 (間隔) を加算します |
ADDTIME() |
時間を加算します |
CONVERT_TZ() |
あるタイムゾーンから別のタイムゾーンに変換します |
CURDATE() |
現在の日付を返します |
CURRENT_DATE() , CURRENT_DATE |
CURDATE() のシノニムです |
CURRENT_TIME() , CURRENT_TIME |
CURTIME() のシノニムです |
CURRENT_TIMESTAMP() , CURRENT_TIMESTAMP |
NOW() のシノニムです |
CURTIME() |
現在の時間を返します |
DATE() |
日付または日付時間式の日付部分を抽出します |
DATE_ADD() |
日付値に時間値 (間隔) を加算します |
DATE_FORMAT() |
日付を指定された書式に設定します |
DATE_SUB() |
日付から時間値 (間隔) を引きます |
DATEDIFF() |
2 つの日付の差を求めます |
DAY() |
DAYOFMONTH() のシノニムです |
DAYNAME() |
曜日の名前を返します |
DAYOFMONTH() |
月の日を返します (0 - 31) |
DAYOFWEEK() |
引数の曜日インデックスを返します |
DAYOFYEAR() |
年の日を返します (1 - 366) |
EXTRACT() |
日付の一部を抽出します |
FROM_DAYS() |
日数を日付に変換します |
FROM_UNIXTIME() |
UNIX タイムスタンプを日付として書式設定します |
GET_FORMAT() |
日付書式文字列を返します |
HOUR() |
時を抽出します |
LAST_DAY |
引数の月の最終日を返します |
LOCALTIME() , LOCALTIME |
NOW() のシノニムです |
LOCALTIMESTAMP , LOCALTIMESTAMP() |
NOW() のシノニムです |
MAKEDATE() |
年と年間通算日から日付を作成します |
MAKETIME() |
時、分、秒から時間を作成します |
MICROSECOND() |
引数からマイクロ秒を返します |
MINUTE() |
引数から分を返します |
MONTH() |
渡された日付から月を返します |
MONTHNAME() |
月の名前を返します |
NOW() |
現在の日付と時間を返します |
PERIOD_ADD() |
年月に期間を加算します |
PERIOD_DIFF() |
期間内の月数を返します |
QUARTER() |
日付引数から四半期を返します |
SEC_TO_TIME() |
秒を「HH:MM:SS」形式に変換します |
SECOND() |
秒 (0-59) を返します |
STR_TO_DATE() |
文字列を日付に変換します |
SUBDATE() |
3 つの引数で呼び出されるときは DATE_SUB() のシノニムです |
SUBTIME() |
時間の差を求めます |
SYSDATE() |
この関数が実行される時間を返します |
TIME() |
渡された式の時部分を抽出します |
TIME_FORMAT() |
時間として書式設定します |
TIME_TO_SEC() |
秒に変換された引数を返します |
TIMEDIFF() |
時間の差を求めます |
TIMESTAMP() |
引数が 1 つの場合、この関数は日付または日付時間式を返します。引数が 2 つの場合、引数の合計を返します |
TIMESTAMPADD() |
日付時間式に間隔を加算します |
TIMESTAMPDIFF() |
日付時間式から間隔を減算します |
TO_DAYS() |
日に変換された日付引数を返します |
TO_SECONDS() |
0 年以降の秒数に変換された日付または日付時間引数を返します |
UNIX_TIMESTAMP() |
UNIX タイムスタンプを返します |
UTC_DATE() |
現在の UTC 日付を返します |
UTC_TIME() |
現在の UTC 時間を返します |
UTC_TIMESTAMP() |
現在の UTC 日付と時間を返します |
WEEK() |
週番号を返します |
WEEKDAY() |
曜日インデックスを返します |
WEEKOFYEAR() |
日付の暦週を返します (0 - 53) |
YEAR() |
年を返します |
YEARWEEK() |
年と週を返します |
次に、日付関数の使用例を示します。次のクエリーは、過去
30 日以内の date_col
値を含むすべての行を選択します。
mysql> SELECT something FROM tbl_name
-> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;
このクエリーは、将来の日付を持つ行も選択します。
通常、日付値が要求される関数では、日付時間値が受け入れられ、時間の部分は無視されます。通常、時間値が要求される関数では、日付時間値が受け入れられ、日付の部分は無視されます。
現在の日付または時間をそれぞれ返す関数は、クエリー実行の開始時にクエリーごとに
1
回だけ評価されます。つまり、NOW()
などの関数が単一クエリー内で複数回参照されても、常に同じ結果が生成されます。(設計上、単一クエリーにはストアドプログラム
(ストアドルーチン、トリガー、またはイベント)
の呼び出し、およびそのプログラムによって呼び出されるすべてのサブプログラムも含まれています。)この原則は、CURDATE()
、CURTIME()
、UTC_DATE()
、UTC_TIME()
、UTC_TIMESTAMP()
、およびそれらのシノニムにも適用されます。
CURRENT_TIMESTAMP()
、CURRENT_TIME()
、CURRENT_DATE()
、および
FROM_UNIXTIME()
関数は、time_zone
システム環境変数の値として使用できる接続の現在のタイムゾーンで値を返します。さらに、UNIX_TIMESTAMP()
では、その引数が現在のタイムゾーンでの日付時間値であるとみなされます。セクション10.6「MySQL Server でのタイムゾーンのサポート」を参照してください。
「zero」 日付または
'2001-11-00'
のような不完全な日付とともに使用できる日付関数もありますが、使用できない日付関数もあります。通常、日付の一部を抽出する関数は不完全な日付でも正しく機能するため、ゼロ以外の値が要求される場合に
0 を返すことができます。例:
mysql> SELECT DAYOFMONTH('2001-11-00'), MONTH('2005-00-00');
-> 0, 0
その他の関数では完全な日付が要求され、日付が不完全な場合は
NULL
が返されます。これらには、日付演算を実行する関数や日付の一部を名前にマップする関数が含まれます。例:
mysql> SELECT DATE_ADD('2006-05-00',INTERVAL 1 DAY);
-> NULL
mysql> SELECT DAYNAME('2006-05-00');
-> NULL
MySQL 5.6.4
の時点では、いくつかの関数は引数として
DATE()
関数の値を渡す際により厳密になったため、ゼロの日付部分を持つ不完全な日付は拒否されます。CONVERT_TZ()
、DATE_ADD()
、DATE_SUB()
、DAYOFYEAR()
、LAST_DAY()
、TIMESTAMPDIFF()
、TO_DAYS()
、TO_SECONDS()
、WEEK()
、WEEKDAY()
、WEEKOFYEAR()
、YEARWEEK()
関数が影響を受けます。5.6.5 の
LAST_DAY()
では、この制限は緩やかで、ゼロの日付部分は許可されていました。
MySQL 5.6.4
以上では、マイクロ秒までの精度を持つ小数秒が
TIME
、DATETIME
、および
TIMESTAMP
値でサポートされています。時間引数を取る関数は、小数秒を含む値を受け入れます。時間関数からの戻り値には、必要に応じて小数秒が含まれます。
-
ADDDATE(
、date
,INTERVALexpr
unit
)ADDDATE(
expr
,days
)INTERVAL
形式の 2 番目の引数を付けて呼び出されると、ADDDATE()
はDATE_ADD()
のシノニムになります。関連する関数SUBDATE()
はDATE_SUB()
のシノニムです。INTERVAL
unit
引数については、DATE_ADD()
の説明を参照してください。mysql> SELECT DATE_ADD('2008-01-02', INTERVAL 31 DAY); -> '2008-02-02' mysql> SELECT ADDDATE('2008-01-02', INTERVAL 31 DAY); -> '2008-02-02'
days
形式の 2 番目の引数を付けて呼び出されると、MySQL ではexpr
に加算される整数の日数として処理されます。mysql> SELECT ADDDATE('2008-01-02', 31); -> '2008-02-02'
-
ADDTIME()
はexpr2
とexpr1
を加算し、その結果を返します。expr1
は時間または日付時間式であり、expr2
は時間式です。mysql> SELECT ADDTIME('2007-12-31 23:59:59.999999', '1 1:1:1.000002'); -> '2008-01-02 01:01:01.000001' mysql> SELECT ADDTIME('01:00:00.999999', '02:00:00.999998'); -> '03:00:01.999997'
-
CONVERT_TZ()
は、日付時間値dt
をfrom_tz
で指定されたタイムゾーンから、to_tz
で指定されたタイムゾーンに変換し、結果の値を返します。タイムゾーンは、セクション10.6「MySQL Server でのタイムゾーンのサポート」で説明されているように指定されます。引数が無効な場合、この関数はNULL
を返します。from_tz
から UTC に変換される際に、値がTIMESTAMP
でサポートされている範囲から外れている場合は、変換が実行されません。TIMESTAMP
の範囲については、セクション11.1.2「日付と時間型の概要」で説明されています。mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'); -> '2004-01-01 13:00:00' mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00'); -> '2004-01-01 22:00:00'
注記名前付きタイムゾーン (
'MET'
または'Europe/Moscow'
など) を使用するには、タイムゾーンテーブルが正しく設定されている必要があります。手順については、セクション10.6「MySQL Server でのタイムゾーンのサポート」を参照してください。 -
関数が文字列と数値コンテキストのどちらで使用されているのかに応じて、現在の日付を
'YYYY-MM-DD'
またはYYYYMMDD
書式の値として返します。mysql> SELECT CURDATE(); -> '2008-06-13' mysql> SELECT CURDATE() + 0; -> 20080613
-
CURRENT_DATE
およびCURRENT_DATE()
はCURDATE()
のシノニムです。 -
CURRENT_TIME
、CURRENT_TIME([
fsp
])CURRENT_TIME
およびCURRENT_TIME()
はCURTIME()
のシノニムです。 -
CURRENT_TIMESTAMP
、CURRENT_TIMESTAMP([
fsp
])CURRENT_TIMESTAMP
およびCURRENT_TIMESTAMP()
はNOW()
のシノニムです。 -
関数が文字列と数値コンテキストのどちらで使用されているのかに応じて、現在の時間を
'HH:MM:SS'
またはHHMMSS
書式の値で返します。値は、現在のタイムゾーンで表現されています。MySQL 5.6.4 の時点では、0 から 6 までの小数秒の精度を指定するために
fsp
引数が指定されている場合は、その桁数の小数秒部分が戻り値に含まれます。5.6.4 よりも前では、すべての引数が無視されます。mysql> SELECT CURTIME(); -> '23:50:26' mysql> SELECT CURTIME() + 0; -> 235026.000000
-
日付または日付時間式
expr
の日付部分を抽出します。mysql> SELECT DATE('2003-12-31 01:02:03'); -> '2003-12-31'
-
DATEDIFF()
は、ある日付から別の日付までの日数の値として表現されたexpr1
−expr2
を返します。expr1
およびexpr2
は、日付または日付時間式です。値の日付部分のみが計算に使用されます。mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30'); -> 1 mysql> SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31'); -> -31
-
DATE_ADD(
,date
,INTERVALexpr
unit
)DATE_SUB(
date
,INTERVALexpr
unit
)これらの関数は日付演算を実行します。
date
引数は、開始日付値または開始日付時間値を指定します。expr
は、開始日付から加算または減算される間隔値を指定する式です。expr
は文字列であり、負の間隔の場合は 「-
」 で始めることができます。unit
は、式を解釈する際の単位を示すキーワードです。INTERVAL
キーワードおよびunit
指定子では、大文字と小文字が区別されません。次の表には、
unit
値ごとに要求される形式のexpr
引数を表示します。unit
値要求される expr
書式MICROSECOND
MICROSECONDS
SECOND
SECONDS
MINUTE
MINUTES
HOUR
HOURS
DAY
DAYS
WEEK
WEEKS
MONTH
MONTHS
QUARTER
QUARTERS
YEAR
YEARS
SECOND_MICROSECOND
'SECONDS.MICROSECONDS'
MINUTE_MICROSECOND
'MINUTES:SECONDS.MICROSECONDS'
MINUTE_SECOND
'MINUTES:SECONDS'
HOUR_MICROSECOND
'HOURS:MINUTES:SECONDS.MICROSECONDS'
HOUR_SECOND
'HOURS:MINUTES:SECONDS'
HOUR_MINUTE
'HOURS:MINUTES'
DAY_MICROSECOND
'DAYS HOURS:MINUTES:SECONDS.MICROSECONDS'
DAY_SECOND
'DAYS HOURS:MINUTES:SECONDS'
DAY_MINUTE
'DAYS HOURS:MINUTES'
DAY_HOUR
'DAYS HOURS'
YEAR_MONTH
'YEARS-MONTHS'
戻り値は引数によって異なります。
第 1 引数が
DATETIME
(またはTIMESTAMP
) 値である場合と、第 1 引数がDATE
で、unit
値にHOURS
、MINUTES
、またはSECONDS
が使用されている場合は、DATETIME
です。それ以外の場合は文字列です。
必ず結果が
DATETIME
になるようにするには、CAST()
を使用すれば、第 1 引数をDATETIME
に変換できます。MySQL では、
expr
書式の句読点区切り文字が許可されます。表には、提案される区切り文字を表示します。date
引数がDATE
値であり、計算にYEAR
、MONTH
、およびDAY
部分のみが含まれる (つまり、時間部分は含まれない) 場合は、結果がDATE
値になります。その他の場合は、結果がDATETIME
値になります。また、日付演算は、
+
または-
演算子とともにINTERVAL
を使用して実行することもできます。date + INTERVAL expr unit date - INTERVAL expr unit
INTERVAL
は、他方の側の式が日付または日付間値である場合に、expr
unit
+
演算子の一方の側で許可されます。-
演算子では、間隔から日付または日付間値を抽出しても意味がないため、INTERVAL
は右側でのみ許可されます。expr
unit
mysql> SELECT '2008-12-31 23:59:59' + INTERVAL 1 SECOND; -> '2009-01-01 00:00:00' mysql> SELECT INTERVAL 1 DAY + '2008-12-31'; -> '2009-01-01' mysql> SELECT '2005-01-01' - INTERVAL 1 SECOND; -> '2004-12-31 23:59:59' mysql> SELECT DATE_ADD('2000-12-31 23:59:59', -> INTERVAL 1 SECOND); -> '2001-01-01 00:00:00' mysql> SELECT DATE_ADD('2010-12-31 23:59:59', -> INTERVAL 1 DAY); -> '2011-01-01 23:59:59' mysql> SELECT DATE_ADD('2100-12-31 23:59:59', -> INTERVAL '1:1' MINUTE_SECOND); -> '2101-01-01 00:01:00' mysql> SELECT DATE_SUB('2005-01-01 00:00:00', -> INTERVAL '1 1:1:1' DAY_SECOND); -> '2004-12-30 22:58:59' mysql> SELECT DATE_ADD('1900-01-01 00:00:00', -> INTERVAL '-1 10' DAY_HOUR); -> '1899-12-30 14:00:00' mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY); -> '1997-12-02' mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002', -> INTERVAL '1.999999' SECOND_MICROSECOND); -> '1993-01-01 00:00:01.000001'
指定した間隔値 (
unit
キーワードから要求されるすべての間隔部分は含まれません) が短すぎる場合は、MySQL では間隔値の左端部分が省略されているとみなされます。たとえば、DAY_SECOND
のunit
を指定した場合は、expr
の値には日、時間、分、秒の部分が含まれるとみなされます。'1:10'
のような値を指定すると、MySQL では日と時間の部分が欠落していて、値は分と秒を表しているとみなされます。つまり、'1:10' DAY_SECOND
は、'1:10' MINUTE_SECOND
と同等の方法で解釈されます。これは、MySQL でTIME
値が時間ではなく経過時間を表していると解釈される方法に類似しています。expr
は文字列として処理されるため、INTERVAL
に文字列以外の値を指定する場合は注意してください。たとえば、間隔指定子がHOUR_MINUTE
の場合は、6/4
が1.5000
に評価され、1 時間 5000 分として処理されます。mysql> SELECT 6/4; -> 1.5000 mysql> SELECT DATE_ADD('2009-01-01', INTERVAL 6/4 HOUR_MINUTE); -> '2009-01-04 12:20:00'
間隔値が予想どおりに解釈されるようにするには、
CAST()
演算を使用します。6/4
を 1 時間 5 分として処理するには、小数点以下の桁数が 1 桁のDECIMAL
値にキャストします。mysql> SELECT CAST(6/4 AS DECIMAL(3,1)); -> 1.5 mysql> SELECT DATE_ADD('1970-01-01 12:00:00', -> INTERVAL CAST(6/4 AS DECIMAL(3,1)) HOUR_MINUTE); -> '1970-01-01 13:05:00'
時間部分が含まれるものを日付値に加算したり、日付値から減算したりすると、自動的に結果が日付時間値に変換されます。
mysql> SELECT DATE_ADD('2013-01-01', INTERVAL 1 DAY); -> '2013-01-02' mysql> SELECT DATE_ADD('2013-01-01', INTERVAL 1 HOUR); -> '2013-01-01 01:00:00'
MONTH
、YEAR_MONTH
、またはYEAR
を加算した結果の日付に、新しい月の最大日数よりも大きな日が含まれる場合は、その日が新しい月の最大日数に調整されます。mysql> SELECT DATE_ADD('2009-01-30', INTERVAL 1 MONTH); -> '2009-02-28'
日付算術演算では、完全な日付が必須であるため、
'2006-07-00'
のような不完全な日付や、誤った形式の日付では正常に機能しません。mysql> SELECT DATE_ADD('2006-07-00', INTERVAL 1 DAY); -> NULL mysql> SELECT '2005-03-32' + INTERVAL 1 MONTH; -> NULL
-
format
文字列に従って、date
値を書式設定します。次の指定子が
format
文字列で使用されている場合があります。書式指定子文字の前には、「%
」 文字を付ける必要があります。指定子 説明 %a
簡略曜日名 ( Sun
..Sat
)%b
簡略月名 ( Jan
..Dec
)%c
月、数字 ( 0
..12
)%D
英語のサフィクスを持つ日付 ( 0th
,1st
,2nd
,3rd
, …)%d
日、数字 ( 00
..31
)%e
日、数字 ( 0
..31
)%f
マイクロ秒 ( 000000
..999999
)%H
時間 ( 00
..23
)%h
時間 ( 01
..12
)%I
時間 ( 01
..12
)%i
分、数字 ( 00
..59
)%j
年間通算日 ( 001
..366
)%k
時 ( 0
..23
)%l
時 ( 1
..12
)%M
月名 ( January
..December
)%m
月、数字 ( 00
..12
)%p
AM
またはPM
%r
時間、12 時間単位 ( hh:mm:ss
にAM
またはPM
が続く)%S
秒 ( 00
..59
)%s
秒 ( 00
..59
)%T
時間、24 時間単位 ( hh:mm:ss
)%U
週 ( 00
..53
)、日曜日が週の初日、WEEK()
モード 0%u
週 ( 00
..53
)、月曜日が週の初日、WEEK()
モード 1%V
週 ( 01
..53
)、日曜日が週の初日、WEEK()
モード 2、%X
とともに使用%v
週 ( 01
..53
)、月曜日が週の初日、WEEK()
モード 3、%x
とともに使用%W
曜日名 ( Sunday
..Saturday
)%w
曜日 ( 0
=Sunday..6
=Saturday)%X
年間の週、日曜日が週の初日、数字、4 桁、 %V
とともに使用%x
年間の週、月曜日が週の初日、数字、4 桁、 %v
とともに使用%Y
年、数字、4 桁 %y
年、数字 (2 桁) %%
リテラル 「 %
」 文字%
x
x
(上記にないすべての 「x
」)MySQL では
'2014-00-00'
などの不完全な日付の格納が許可されるため、月および日の指定子の範囲はゼロから始まります。日および月の名前と略語に使用される言語は、
lc_time_names
システム変数 (セクション10.7「MySQL Server のロケールサポート」) の値で制御されます。%U
、%u
、%V
、および%v
指定子のモード値については、WEEK()
関数の説明を参照してください。モードによって、週番号が付与される方法が影響を受けます。DATE_FORMAT()
は、ASCII 以外の文字を含む月および週の名前を返すことができるように、character_set_connection
およびcollation_connection
で指定された文字セットおよび照合順序を含む文字列を返します。mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'); -> 'Sunday October 2009' mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s'); -> '22:23:00' mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00', -> '%D %y %a %d %m %b %j'); -> '4th 00 Thu 04 10 Oct 277' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', -> '%H %k %I %r %T %S %w'); -> '22 22 10 10:23:00 PM 22:23:00 00 6' mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V'); -> '1998 52' mysql> SELECT DATE_FORMAT('2006-06-00', '%d'); -> '00'
-
DATE_SUB(
date
,INTERVALexpr
unit
)DATE_ADD()
の説明を参照してください。 -
DAY()
はDAYOFMONTH()
のシノニムです。 -
date
に対応する曜日の名前を返します。名前に使用される言語は、lc_time_names
システム変数 (セクション10.7「MySQL Server のロケールサポート」) の値で制御されます。mysql> SELECT DAYNAME('2007-02-03'); -> 'Saturday'
-
1
から31
までの範囲内でdate
に対応する日を返します。'0000-00-00'
や'2008-00-00'
のように日の部分がゼロの場合は、0
を返します。mysql> SELECT DAYOFMONTH('2007-02-03'); -> 3
-
date
の曜日インデックス (1
= Sunday、2
= Monday、…、7
= Saturday) を返します。これらのインデックス値は、ODBC 標準に対応しています。mysql> SELECT DAYOFWEEK('2007-02-03'); -> 7
-
1
から366
までの範囲内でdate
に対応する通日を返します。mysql> SELECT DAYOFYEAR('2007-02-03'); -> 34
-
EXTRACT()
関数では、DATE_ADD()
またはDATE_SUB()
と同じ単位指定子が使用されますが、データ演算が実行されるのではなく、データから一部が抽出されます。mysql> SELECT EXTRACT(YEAR FROM '2009-07-02'); -> 2009 mysql> SELECT EXTRACT(YEAR_MONTH FROM '2009-07-02 01:02:03'); -> 200907 mysql> SELECT EXTRACT(DAY_MINUTE FROM '2009-07-02 01:02:03'); -> 20102 mysql> SELECT EXTRACT(MICROSECOND -> FROM '2003-01-02 10:30:00.000123'); -> 123
-
日数
N
が指定され、DATE
値を返します。mysql> SELECT FROM_DAYS(730669); -> '2007-07-03'
古い日付では、
FROM_DAYS()
を慎重に使用してください。グレゴリオ暦 (1582) の出現よりも前の値とともに使用することを目的に設計されていません。セクション12.8「MySQL で使用されるカレンダー」を参照してください。 -
FROM_UNIXTIME(
,unix_timestamp
)FROM_UNIXTIME(
unix_timestamp
,format
)関数が文字列と数値のどちらのコンテキストで使用されたのかに応じて、
unix_timestamp
引数の表現を'YYYY-MM-DD HH:MM:SS'
またはYYYYMMDDHHMMSS
書式の値として返します。値は、現在のタイムゾーンで表現されています。unix_timestamp
は、UNIX_TIMESTAMP()
関数で生成されるような内部タイムスタンプ値です。format
が指定されている場合は、DATE_FORMAT()
関数のエントリで一覧表示される場合と同じ方法で使用されるformat
文字列に従って、結果が書式設定されます。mysql> SELECT FROM_UNIXTIME(1196440219); -> '2007-11-30 10:30:19' mysql> SELECT FROM_UNIXTIME(1196440219) + 0; -> 20071130103019.000000 mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), -> '%Y %D %M %h:%i:%s %x'); -> '2007 30th November 10:30:59 2007'
注:
UNIX_TIMESTAMP()
およびFROM_UNIXTIME()
を使用してTIMESTAMP
値と Unix タイムスタンプ値とを変換する場合は、どちらの方向でもマッピングが 1 対 1 ではないため、変換は不可逆です。詳細はUNIX_TIMESTAMP()
関数の説明を参照してください。 -
GET_FORMAT({DATE|TIME|DATETIME}, {'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL'})
書式文字列を返します。この関数は、
DATE_FORMAT()
およびSTR_TO_DATE()
関数と組み合わせて使用すると便利です。1 番目と 2 番目の引数に値を指定できるため、複数の書式文字列を生成できます (使用される指定子については、
DATE_FORMAT()
関数の説明で示す表を参照してください)。ISO 書式は ISO 8601 ではなく、ISO 9075 を参照しています。関数呼び出し 結果 GET_FORMAT(DATE,'USA')
'%m.%d.%Y'
GET_FORMAT(DATE,'JIS')
'%Y-%m-%d'
GET_FORMAT(DATE,'ISO')
'%Y-%m-%d'
GET_FORMAT(DATE,'EUR')
'%d.%m.%Y'
GET_FORMAT(DATE,'INTERNAL')
'%Y%m%d'
GET_FORMAT(DATETIME,'USA')
'%Y-%m-%d %H.%i.%s'
GET_FORMAT(DATETIME,'JIS')
'%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'ISO')
'%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'EUR')
'%Y-%m-%d %H.%i.%s'
GET_FORMAT(DATETIME,'INTERNAL')
'%Y%m%d%H%i%s'
GET_FORMAT(TIME,'USA')
'%h:%i:%s %p'
GET_FORMAT(TIME,'JIS')
'%H:%i:%s'
GET_FORMAT(TIME,'ISO')
'%H:%i:%s'
GET_FORMAT(TIME,'EUR')
'%H.%i.%s'
GET_FORMAT(TIME,'INTERNAL')
'%H%i%s'
TIMESTAMP
は、GET_FORMAT()
への 1 番目の引数としても使用できます。その場合、関数はDATETIME
の場合と同じ値を返します。mysql> SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR')); -> '03.10.2003' mysql> SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA')); -> '2003-10-31'
-
time
に対応する時を返します。戻り値の範囲は、日付時間値の0
から23
までです。ただし、TIME
値の範囲は実際にはもっと大きいため、HOUR
は23
よりも大きい値を返すことができます。mysql> SELECT HOUR('10:05:03'); -> 10 mysql> SELECT HOUR('272:59:59'); -> 272
-
日付または日付時間の値が指定され、月の最終日に対応する値を返します。引数が無効である場合は、
NULL
を返します。mysql> SELECT LAST_DAY('2003-02-05'); -> '2003-02-28' mysql> SELECT LAST_DAY('2004-02-05'); -> '2004-02-29' mysql> SELECT LAST_DAY('2004-01-01 01:01:01'); -> '2004-01-31' mysql> SELECT LAST_DAY('2003-03-32'); -> NULL
-
LOCALTIME
およびLOCALTIME()
はNOW()
のシノニムです。 -
LOCALTIMESTAMP
,LOCALTIMESTAMP([
fsp
])LOCALTIMESTAMP
およびLOCALTIMESTAMP()
はNOW()
のシノニムです。 -
指定された年と年間通算値から、日付を返します。
dayofyear
は 0 よりも大きくする必要があり、それ以外の場合は結果がNULL
になります。mysql> SELECT MAKEDATE(2011,31), MAKEDATE(2011,32); -> '2011-01-31', '2011-02-01' mysql> SELECT MAKEDATE(2011,365), MAKEDATE(2014,365); -> '2011-12-31', '2014-12-31' mysql> SELECT MAKEDATE(2011,0); -> NULL
-
hour
、minute
、およびsecond
引数から計算された時間値を返します。MySQL 5.6.4 の時点では、
second
引数に小数部を含めることができます。mysql> SELECT MAKETIME(12,15,30); -> '12:15:30'
-
0
から999999
までの範囲内の数値として、時間または日付時間式expr
からのマイクロ秒を返します。mysql> SELECT MICROSECOND('12:00:00.123456'); -> 123456 mysql> SELECT MICROSECOND('2009-12-31 23:59:59.000010'); -> 10
-
0
から59
までの範囲内で、time
に対応する分を返します。mysql> SELECT MINUTE('2008-02-03 10:05:03'); -> 5
-
1
(1 月) から12
(12 月) の範囲内で、date
に対応する月を返します。'0000-00-00'
や'2008-00-00'
のように月の部分がゼロの場合は、0
を返します。mysql> SELECT MONTH('2008-02-03'); -> 2
-
date
に対応する月の完全名を返します。名前に使用される言語は、lc_time_names
システム変数 (セクション10.7「MySQL Server のロケールサポート」) の値で制御されます。mysql> SELECT MONTHNAME('2008-02-03'); -> 'February'
-
関数が文字列と数値のどちらのコンテキストで使用されているのかに応じて、現在の日付と時間を
'YYYY-MM-DD HH:MM:SS'
またはYYYYMMDDHHMMSS
書式の値として返します。値は、現在のタイムゾーンで表現されています。MySQL 5.6.4 の時点では、0 から 6 までの小数秒の精度を指定するために
fsp
引数が指定されている場合は、その桁数の小数秒部分が戻り値に含まれます。5.6.4 よりも前では、すべての引数が無視されます。mysql> SELECT NOW(); -> '2007-12-15 23:50:26' mysql> SELECT NOW() + 0; -> 20071215235026.000000
NOW()
は、ステートメントが実行を開始する時刻を示す定数時間を返します。(ストアドファンクションまたはトリガーでは、NOW()
は関数またはトリガーステートメントが実行を開始する時間を返します。)これは、正確な実行時間を返すSYSDATE()
の動作とは異なります。mysql> SELECT NOW(), SLEEP(2), NOW(); +---------------------+----------+---------------------+ | NOW() | SLEEP(2) | NOW() | +---------------------+----------+---------------------+ | 2006-04-12 13:47:36 | 0 | 2006-04-12 13:47:36 | +---------------------+----------+---------------------+ mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE(); +---------------------+----------+---------------------+ | SYSDATE() | SLEEP(2) | SYSDATE() | +---------------------+----------+---------------------+ | 2006-04-12 13:47:44 | 0 | 2006-04-12 13:47:46 | +---------------------+----------+---------------------+
さらに、
SET TIMESTAMP
ステートメントによって、NOW()
で返された値は影響を受けますが、SYSDATE()
で返された値は影響を受けません。つまり、バイナリログのタイムスタンプ設定は、SYSDATE()
の呼び出しに影響しないことを意味します。タイムスタンプをゼロ以外の値に設定すると、後続のNOW()
が起動されるたびに、その値が返されます。タイムスタンプをゼロに設定すると、この効果が取り消され、再度NOW()
が現在の日付と時間を返すようになります。2 つの関数の相違点についての詳細は、
SYSDATE()
の説明を参照してください。 -
N
月を期間P
に (YYMM
またはYYYYMM
の書式で) 加算します。YYYYMM
の書式で値を返します。注記期間引数
P
は、日付値ではありません。mysql> SELECT PERIOD_ADD(200801,2); -> 200803
-
期間
P1
とP2
間の月数を返します。P1
およびP2
は、YYMM
またはYYYYMM
の書式にする必要があります。期間引数P1
およびP2
は日付値ではないことに注意してください。mysql> SELECT PERIOD_DIFF(200802,200703); -> 11
-
1
から4
までの範囲内でdate
に対応する四半期を返します。mysql> SELECT QUARTER('2008-04-01'); -> 2
-
0
から59
までの範囲内で、time
に対応する秒数を返します。mysql> SELECT SECOND('10:05:03'); -> 3
-
TIME
値として、時、分、秒に変換されたseconds
引数を返します。結果の範囲は、TIME
データ型の範囲に制約されます。引数がその範囲外の値に対応している場合は、警告が発行されます。mysql> SELECT SEC_TO_TIME(2378); -> '00:39:38' mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938
-
これは
DATE_FORMAT()
関数の逆です。文字列str
と書式文字列format
が指定されます。STR_TO_DATE()
は、書式文字列に日付と時間の両方の部分が含まれる場合はDATETIME
値を返し、文字列に日付と時間の部分の一方のみが含まれる場合はDATE
またはTIME
値を返します。str
から抽出された日付値、時間値、または日付時間値が不正な場合は、STR_TO_DATE()
によってNULL
が返され、警告が発行されます。サーバーは
str
をスキャンすることで、format
の一致を試みます。書式文字列には、リテラル文字と%
で始まる書式指定子を含めることができます。format
内のリテラル文字は、str
内と完全に一致する必要があります。format
内の書式指定子は、str
内の日付または時間の部分に一致する必要があります。format
で使用できる指定子については、DATE_FORMAT()
関数の説明を参照してください。mysql> SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y'); -> '2013-05-01' mysql> SELECT STR_TO_DATE('May 1, 2013','%M %d,%Y'); -> '2013-05-01'
str
の先頭からスキャンが開始され、一致しないformat
が見つかった場合は失敗します。str
の末尾にある余分な文字は、無視されます。mysql> SELECT STR_TO_DATE('a09:30:17','a%h:%i:%s'); -> '09:30:17' mysql> SELECT STR_TO_DATE('a09:30:17','%h:%i:%s'); -> NULL mysql> SELECT STR_TO_DATE('09:30:17a','%h:%i:%s'); -> '09:30:17'
指定されていない日付または時間の部分の値は 0 になるため、
str
に指定された値が不完全な場合は、結果の一部または全部が 0 に設定されます。mysql> SELECT STR_TO_DATE('abc','abc'); -> '0000-00-00' mysql> SELECT STR_TO_DATE('9','%m'); -> '0000-09-00' mysql> SELECT STR_TO_DATE('9','%s'); -> '00:00:09'
日付値の部分をチェックする範囲は、セクション11.3.1「DATE、DATETIME、および TIMESTAMP 型」の説明どおりです。たとえば、「ゼロ」の日付または部分値が 0 の日付は、このような値が許可されないように SQL モードが設定されていなければ、許可されます。
mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y'); -> '0000-00-00' mysql> SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y'); -> '2004-04-31'
注記週が月の境界を越えた場合は、年と週の組み合わせでは年と月を一意に識別できないため、
"%X%V"
の書式を使用しても、年と週の文字列を日付に変換できません。年と週を日付に変換するには、曜日も指定する必要があります。mysql> SELECT STR_TO_DATE('200442 Monday', '%X%V %W'); -> '2004-10-18'
-
SUBDATE(
,date
,INTERVALexpr
unit
)SUBDATE(
expr
,days
)INTERVAL
形式で 2 番目の引数を付けて呼び出されると、SUBDATE()
はDATE_SUB()
のシノニムになります。INTERVAL
unit
引数については、DATE_ADD()
の説明を参照してください。mysql> SELECT DATE_SUB('2008-01-02', INTERVAL 31 DAY); -> '2007-12-02' mysql> SELECT SUBDATE('2008-01-02', INTERVAL 31 DAY); -> '2007-12-02'
2 番目の形式では、
days
の整数値を使用できます。このような場合は、日付または日付時間式expr
から日数が減算されると解釈されます。mysql> SELECT SUBDATE('2008-01-02 12:00:00', 31); -> '2007-12-02 12:00:00'
-
SUBTIME()
は、expr1
と同じ書式で表現されるexpr1
とexpr2
を返します。expr1
は時間または日付時間式であり、expr2
は時間式です。mysql> SELECT SUBTIME('2007-12-31 23:59:59.999999','1 1:1:1.000002'); -> '2007-12-30 22:58:58.999997' mysql> SELECT SUBTIME('01:00:00.999999', '02:00:00.999998'); -> '-00:59:59.999999'
-
関数が文字列と数値のどちらのコンテキストで使用されているのかに応じて、現在の日付と時間を
'YYYY-MM-DD HH:MM:SS'
またはYYYYMMDDHHMMSS
書式の値として返します。MySQL 5.6.4 の時点では、0 から 6 までの小数秒の精度を指定するために
fsp
引数が指定されている場合は、その桁数の小数秒部分が戻り値に含まれます。5.6.4 よりも前では、すべての引数が無視されます。SYSDATE()
は、実行された時間を返します。これは、ステートメントが実行を開始する時間を示す定数時間を返すNOW()
の動作とは異なります。(ストアドファンクションまたはトリガーでは、NOW()
は関数またはトリガーステートメントが実行を開始する時間を返します。)mysql> SELECT NOW(), SLEEP(2), NOW(); +---------------------+----------+---------------------+ | NOW() | SLEEP(2) | NOW() | +---------------------+----------+---------------------+ | 2006-04-12 13:47:36 | 0 | 2006-04-12 13:47:36 | +---------------------+----------+---------------------+ mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE(); +---------------------+----------+---------------------+ | SYSDATE() | SLEEP(2) | SYSDATE() | +---------------------+----------+---------------------+ | 2006-04-12 13:47:44 | 0 | 2006-04-12 13:47:46 | +---------------------+----------+---------------------+
さらに、
SET TIMESTAMP
ステートメントによって、NOW()
で返された値は影響を受けますが、SYSDATE()
で返された値は影響を受けません。つまり、バイナリログのタイムスタンプ設定は、SYSDATE()
の呼び出しに影響しないことを意味します。SYSDATE()
は、同じステートメント内でもさまざまな値を返すことができ、SET TIMESTAMP
による影響も受けないため、非決定的です。そのため、ステートメントベースのバイナリロギングが使用されている場合は、レプリケーションで安全に使用できません。これが問題となる場合は、行ベースのロギングを使用できます。また、
--sysdate-is-now
オプションを使用すると、SYSDATE()
をNOW()
のエイリアスにすることができます。これは、オプションがマスターとスレーブの両方で使用される場合に機能します。SYSDATE()
に非決定的な特性があるということは、それを参照する式を評価する際にインデックスを使用できないことも意味します。 -
時間または日付時間式
expr
の時部分を抽出し、文字列として返します。この関数は、ステートメントベースのレプリケーションでは安全に使用できません。
binlog_format
がSTATEMENT
に設定されているときに、この関数を使用すると、警告のログが記録されます。mysql> SELECT TIME('2003-12-31 01:02:03'); -> '01:02:03' mysql> SELECT TIME('2003-12-31 01:02:03.000123'); -> '01:02:03.000123'
-
TIMEDIFF()
は、時間値として表現されたexpr1
−expr2
を返します。expr1
およびexpr2
は時間または日付時間式ですが、両方とも同じ型にする必要があります。TIMEDIFF()
で返される結果は、TIME
値で許可される範囲に制限されています。また、TIMESTAMPDIFF()
およびUNIX_TIMESTAMP()
関数のいずれかを使用することもできます。両方とも整数を返します。mysql> SELECT TIMEDIFF('2000:01:01 00:00:00', -> '2000:01:01 00:00:00.000001'); -> '-00:00:00.000001' mysql> SELECT TIMEDIFF('2008-12-31 23:59:59.000001', -> '2008-12-30 01:01:01.000002'); -> '46:58:57.999999'
-
TIMESTAMP(
,expr
)TIMESTAMP(
expr1
,expr2
)引数を 1 つ付けると、この関数は日付または日付時間式
expr
を日付時間値として返します。引数を 2 つ付けると、時間式expr2
を日付または日付時間式expr1
に加算し、その結果を日付時間値として返します。mysql> SELECT TIMESTAMP('2003-12-31'); -> '2003-12-31 00:00:00' mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00'); -> '2004-01-01 00:00:00'
-
TIMESTAMPADD(
unit
,interval
,datetime_expr
)整数式
interval
を日付または日付時間式datetime_expr
に加算します。interval
の単位は、unit
引数で指定されます。この引数は、MICROSECOND
(マイクロ秒)、SECOND
、MINUTE
、HOUR
、DAY
、WEEK
、MONTH
、QUARTER
、YEAR
値のいずれかにする必要があります。unit
値を指定するには、ここで示したキーワードのいずれかを使用するか、SQL_TSI_
をプリフィクスとして付けます。たとえば、DAY
とSQL_TSI_DAY
は両方とも有効です。mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02'); -> '2003-01-02 00:01:00' mysql> SELECT TIMESTAMPADD(WEEK,1,'2003-01-02'); -> '2003-01-09'
-
TIMESTAMPDIFF(
unit
,datetime_expr1
,datetime_expr2
)datetime_expr2
−datetime_expr1
を返します。datetime_expr1
とdatetime_expr2
は、日付または日付時間式です。式の一方が日付で、他方が日付時間にすることもできます。日付値は、必要に応じて時間部分が'00:00:00'
の日付時間として処理されます。結果 (整数) の単位は、unit
引数で指定されます。unit
の有効な値は、TIMESTAMPADD()
関数の説明で一覧表示された値と同じです。mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'); -> 3 mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01'); -> -1 mysql> SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55'); -> 128885
注記この関数の日付または日付時間引数の順序は、
TIMESTAMP()
関数を 2 つの引数を指定して呼び出す場合の順序と逆になります。 -
これは
DATE_FORMAT()
関数と同様に使用されますが、format
文字列には時間、分、秒、マイクロ秒の書式指定子のみを含めることができます。その他の指定子では、NULL
値または0
が生成されます。time
値に23
よりも大きな時間部分が含まれる場合は、%H
および%k
時間書式指定子によって、0..23
の通常の範囲よりも大きな値が生成されます。その他の時間書式指定子では、時間値モジュロ 12 が生成されます。mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l'); -> '100 100 04 04 4'
-
秒に変換された
time
引数を返します。mysql> SELECT TIME_TO_SEC('22:23:00'); -> 80580 mysql> SELECT TIME_TO_SEC('00:39:38'); -> 2378
-
日付
date
が指定され、日数 (0 年以降の日数) を返します。mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS('2007-10-07'); -> 733321
TO_DAYS()
は、カレンダーが変更された際に失われた日が考慮されないため、グレゴリオ暦 (1582) の出現よりも前の値とともに使用するために設計されていません。日付が 1582 よりも前の場合は (ほかのロケールでは、さらにあとの年になる可能性があります)、この関数の結果は信頼できません。詳細は セクション12.8「MySQL で使用されるカレンダー」を参照してください。MySQL では セクション11.3「日付と時間型」 のルールを使用して、日付の 2 桁の年の値が 4 桁の形式に変換されることを忘れないでください。たとえば、
'2008-10-07'
と'08-10-07'
は同じ日付と認識されます。mysql> SELECT TO_DAYS('2008-10-07'), TO_DAYS('08-10-07'); -> 733687, 733687
MySQL では、ゼロの日付は
'0000-00-00'
として定義されます。ただし、このデータ自体は無効とみなされます。つまり、'0000-00-00'
および'0000-01-01'
の場合、TO_DAYS()
は次に示す値を返します。mysql> SELECT TO_DAYS('0000-00-00'); +-----------------------+ | to_days('0000-00-00') | +-----------------------+ | NULL | +-----------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS; +---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '0000-00-00' | +---------+------+----------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT TO_DAYS('0000-01-01'); +-----------------------+ | to_days('0000-01-01') | +-----------------------+ | 1 | +-----------------------+ 1 row in set (0.00 sec)
このことは、
ALLOW_INVALID_DATES
SQL サーバーモードが有効であるかどうかに関係なく当てはまります。 -
日付または日付時間の
expr
が指定され、0 年以降の日数を返します。expr
が有効な日付または日付時間の値ではない場合は、NULL
を返します。mysql> SELECT TO_SECONDS(950501); -> 62966505600 mysql> SELECT TO_SECONDS('2009-11-29'); -> 63426672000 mysql> SELECT TO_SECONDS('2009-11-29 13:43:32'); -> 63426721412 mysql> SELECT TO_SECONDS( NOW() ); -> 63426721458
TO_DAYS()
と同様に、TO_SECONDS()
は、カレンダーが変更された際に失われた日が考慮されないため、グレゴリオ暦 (1582) の出現よりも前の値とともに使用する目的で設計されていません。日付が 1582 よりも前の場合は (ほかのロケールでは、さらにあとの年になる可能性があります)、この関数の結果は信頼できません。詳細は セクション12.8「MySQL で使用されるカレンダー」を参照してください。TO_DAYS()
と同様に、TO_SECONDS()
は セクション11.3「日付と時間型」 のルールを使用して日付の 2 桁の年の値を 4 桁の形式に変換します。MySQL では、ゼロの日付は
'0000-00-00'
として定義されます。ただし、このデータ自体は無効とみなされます。つまり、'0000-00-00'
および'0000-01-01'
の場合、TO_SECONDS()
は次に示す値を返します。mysql> SELECT TO_SECONDS('0000-00-00'); +--------------------------+ | TO_SECONDS('0000-00-00') | +--------------------------+ | NULL | +--------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS; +---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '0000-00-00' | +---------+------+----------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT TO_SECONDS('0000-01-01'); +--------------------------+ | TO_SECONDS('0000-01-01') | +--------------------------+ | 86400 | +--------------------------+ 1 row in set (0.00 sec)
このことは、
ALLOW_INVALID_DATES
SQL サーバーモードが有効であるかどうかに関係なく当てはまります。 -
UNIX_TIMESTAMP()
、UNIX_TIMESTAMP(
date
)引数なしで呼び出された場合は、Unix タイムスタンプ (
'1970-01-01 00:00:00'
UTC 以降の秒数) を符号なし整数として返します。date
引数を付けてUNIX_TIMESTAMP()
が呼び出された場合は、その引数の値が'1970-01-01 00:00:00'
UTC 以降の秒数として返されます。date
には、DATE
文字列、DATETIME
文字列、TIMESTAMP
、YYMMDD
またはYYYYMMDD
書式の数値を指定できます。サーバーはdate
を現在のタイムゾーンの値として解釈し、UTC の内部値に変換します。クライアントは、セクション10.6「MySQL Server でのタイムゾーンのサポート」で説明するとおりに、独自のタイムゾーンを設定できます。mysql> SELECT UNIX_TIMESTAMP(); -> 1196440210 mysql> SELECT UNIX_TIMESTAMP('2007-11-30 10:30:19'); -> 1196440219
UNIX_TIMESTAMP()
がTIMESTAMP
カラムで使用されると、暗黙的に 「string-to-Unix-timestamp」 に変換されずに、内部タイムスタンプ値が直接返されます。UNIX_TIMESTAMP()
に範囲外の日付を渡すと、0
が返されます。注:
UNIX_TIMESTAMP()
およびFROM_UNIXTIME()
を使用してTIMESTAMP
値と Unix タイムスタンプ値とを変換する場合は、どちらの方向でもマッピングが 1 対 1 ではないため、変換は不可逆です。たとえば、ローカルタイムゾーンを変更するための変換が原因で、2 つのUNIX_TIMESTAMP()
で 2 つのTIMESTAMP
値が同じ Unix タイムスタンプ値にマップされる可能性があります。FROM_UNIXTIME()
は、その値を元のTIMESTAMP
値のいずれかにのみマップし直します。次に、CET
タイムゾーンでのTIMESTAMP
値の使用例を示します。mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00'); +---------------------------------------+ | UNIX_TIMESTAMP('2005-03-27 03:00:00') | +---------------------------------------+ | 1111885200 | +---------------------------------------+ mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00'); +---------------------------------------+ | UNIX_TIMESTAMP('2005-03-27 02:00:00') | +---------------------------------------+ | 1111885200 | +---------------------------------------+ mysql> SELECT FROM_UNIXTIME(1111885200); +---------------------------+ | FROM_UNIXTIME(1111885200) | +---------------------------+ | 2005-03-27 03:00:00 | +---------------------------+
UNIX_TIMESTAMP()
カラムを減算する場合は、結果を符号付きの整数にキャストします。セクション12.10「キャスト関数と演算子」を参照してください。 -
関数が文字列と数値のどちらのコンテキストで使用されているのかに応じて、現在の UTC 日付を
'YYYY-MM-DD'
またはYYYYMMDD
書式の値で返します。mysql> SELECT UTC_DATE(), UTC_DATE() + 0; -> '2003-08-14', 20030814
-
関数が文字列と数値のどちらのコンテキストで使用されているのかに応じて、現在の UTC 時間を
'HH:MM:SS'
またはHHMMSS
書式の値で返します。MySQL 5.6.4 の時点では、0 から 6 までの小数秒の精度を指定するために
fsp
引数が指定されている場合は、その桁数の小数秒部分が戻り値に含まれます。5.6.4 よりも前では、すべての引数が無視されます。mysql> SELECT UTC_TIME(), UTC_TIME() + 0; -> '18:07:53', 180753.000000
-
UTC_TIMESTAMP
、UTC_TIMESTAMP([
fsp
])関数が文字列と数値のどちらのコンテキストで使用されているのかに応じて、現在の UTC 日付と時間を
'YYYY-MM-DD HH:MM:SS'
またはYYYYMMDDHHMMSS
書式の値として返します。MySQL 5.6.4 の時点では、0 から 6 までの小数秒の精度を指定するために
fsp
引数が指定されている場合は、その桁数の小数秒部分が戻り値に含まれます。5.6.4 よりも前では、すべての引数が無視されます。mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0; -> '2003-08-14 18:08:04', 20030814180804.000000
-
この関数は、
date
に対応する週番号を返します。2 つの引数を取る形式のWEEK()
を使用すると、週が日曜日と月曜日のどちらから始まるのか、および戻り値が0
から53
までと1
から53
までのどちらの範囲内であるのかを指定できます。mode
引数が省略された場合は、default_week_format
システム変数の値が使用されます。セクション5.1.4「サーバーシステム変数」を参照してください。次の表では、
mode
引数がどのように機能するのかについて説明します。モード 週の 1 日目 範囲 第 1 週は次の条件を満たす最初の週 0 日曜日 0-53 本年の日曜日を含む 1 月曜日 0-53 本年の 4 日以上を含む 2 日曜日 1-53 本年の日曜日を含む 3 月曜日 1-53 本年の 4 日以上を含む 4 日曜日 0-53 本年の 4 日以上を含む 5 月曜日 0-53 本年の月曜日を含む 6 日曜日 1-53 本年の 4 日以上を含む 7 月曜日 1-53 本年の月曜日を含む 「本年の 4 日以上を含む」という意味を持つ
mode
値では、ISO 8601:1988 に従って週番が付けられます。1 月 1 日を含む週に新年の 4 日以上が含まれる場合は、その週が第 1 週です。
それ以外の場合は、前年の最終週となり、次の週が第 1 週です。
mysql> SELECT WEEK('2008-02-20'); -> 7 mysql> SELECT WEEK('2008-02-20',0); -> 7 mysql> SELECT WEEK('2008-02-20',1); -> 8 mysql> SELECT WEEK('2008-12-31',1); -> 53
日付が前年の最終週に入っている場合は、オプションの
mode
引数として2
、3
、6
、または7
を使用しなければ、MySQL によって0
が返されます。mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0); -> 2000, 0
指定された日付は実際には 1999 年の第 52 週に発生するため、
WEEK()
は52
を返す必要があると議論されることもあります。代わりにWEEK()
は、戻り値が「指定された年の週番号」となるように0
を返します。これにより、日付から日付部分を抽出するその他の関数と組み合わせると、WEEK()
関数を信頼して使用できるようになります。指定された日付に対応する週の 1 日目を含む年について評価された結果を優先する場合は、オプションの
mode
引数として0
、2
、5
、または7
を使用します。mysql> SELECT WEEK('2000-01-01',2); -> 52
または、
YEARWEEK()
関数を使用します。mysql> SELECT YEARWEEK('2000-01-01'); -> 199952 mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2); -> '52'
-
date
に対応する曜日インデックス (0
= Monday、1
= Tuesday、…6
= Sunday) を返します。mysql> SELECT WEEKDAY('2008-02-03 22:23:00'); -> 6 mysql> SELECT WEEKDAY('2007-11-06'); -> 1
-
1
から53
までの範囲内で、日付の暦週を返します。WEEKOFYEAR()
はWEEK(
に同等の互換性のある関数です。date
,3)mysql> SELECT WEEKOFYEAR('2008-02-20'); -> 8
-
1000
から9999
までの範囲内で、date
に対応する年を返します。日付が「ゼロ」の場合は、0
を返します。mysql> SELECT YEAR('1987-01-01'); -> 1987
-
YEARWEEK(
、date
)YEARWEEK(
date
,mode
)日付に対応する年と週を返します。
mode
引数は、WEEK()
へのmode
引数とまったく同様に機能します。結果の年と日付引数の年では、その年の最初と最後の週が異なる可能性があります。mysql> SELECT YEARWEEK('1987-01-01'); -> 198653
WEEK()
はその後、指定された年のコンテキストで週を返すため、週番号はオプションの引数0
または1
を付けた場合にWEEK()
関数で返される数字 (0
) とは異なります。