このセクションでは、時間値の処理に使用できる関数について説明します。 各日付日時型が持つ値の範囲、および値を指定する際の有効な書式については、セクション11.2「日時データ型」を参照してください。
表 12.11 「日付および時刻関数」
名前 | 説明 |
---|---|
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() |
日付の暦週を返します (1 - 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()
では、引数がセッションタイムゾーンの日時値であると想定しています。 セクション5.1.15「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
DATE()
関数の値を引数として渡し、日部分がゼロの不完全な日付を拒否すると、いくつかの関数が厳密になります: CONVERT_TZ()
, DATE_ADD()
, DATE_SUB()
, DAYOFYEAR()
, TIMESTAMPDIFF()
, TO_DAYS()
, TO_SECONDS()
, WEEK()
, WEEKDAY()
, WEEKOFYEAR()
, YEARWEEK()
。
TIME
、DATETIME
および TIMESTAMP
値の小数秒は、マイクロ秒までの精度でサポートされます。 時間引数を取る関数は、小数秒を含む値を受け入れます。 時間関数からの戻り値には、必要に応じて小数秒が含まれます。
-
ADDDATE(
,date
,INTERVALexpr
unit
)ADDDATE(
expr
,days
)INTERVAL
形式の 2 番目の引数を付けて呼び出されると、ADDDATE()
はDATE_ADD()
のシノニムになります。 関連する関数SUBDATE()
はDATE_SUB()
のシノニムです。INTERVAL
unit
引数の詳細は、時間間隔 を参照してください。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(
expr1
,expr2
)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
)CONVERT_TZ()
は、日付時間値dt
をfrom_tz
で指定されたタイムゾーンから、to_tz
で指定されたタイムゾーンに変換し、結果の値を返します。 タイムゾーンは、セクション5.1.15「MySQL Server でのタイムゾーンのサポート」で説明されているように指定されます。 引数が無効な場合、この関数はNULL
を返します。from_tz
から UTC に変換される際に、値がTIMESTAMP
でサポートされている範囲から外れている場合は、変換が実行されません。TIMESTAMP
の範囲については、セクション11.2.1「日時データ型の構文」で説明されています。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/Amsterdam'
などの名前付きタイムゾーンを使用するには、タイムゾーンテーブルが適切に設定されている必要があります。 その手順は、セクション5.1.15「MySQL Server でのタイムゾーンのサポート」を参照してください。 -
CURDATE()
関数が文字列または数値のどちらのコンテキストで使用されているかに応じて、現在の日付を
'
またはYYYY-MM-DD
'YYYYMMDD
形式の値として返します。mysql> SELECT CURDATE(); -> '2008-06-13' mysql> SELECT CURDATE() + 0; -> 20080613
-
CURRENT_DATE
,CURRENT_DATE()
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()
のシノニムです。 -
CURTIME([
fsp
])関数が文字列または数値のどちらのコンテキストで使用されているかに応じて、現在の時間を
'hh:mm:ss'
またはhhmmss
形式の値として返します。 値はセッションのタイムゾーンで表されます。0 から 6 までの小数秒精度を指定するために
fsp
引数が指定されている場合、戻り値にはその桁数の小数秒部分が含まれます。mysql> SELECT CURTIME(); -> '23:50:26' mysql> SELECT CURTIME() + 0; -> 235026.000000
-
DATE(
expr
)日付または日付時間式
expr
の日付部分を抽出します。mysql> SELECT DATE('2003-12-31 01:02:03'); -> '2003-12-31'
-
DATEDIFF(
expr1
,expr2
)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
は、式を解釈する単位を示すキーワードです。unit
指定子の完全なリスト、各unit
値に必要なexpr
引数の形式、および時間演算でのオペランド解釈の規則など、時間間隔構文の詳細は、時間間隔 を参照してください。戻り値は引数によって異なります。
date
引数がDATE
値で、計算にYEAR
、MONTH
およびDAY
部分のみが含まれる (つまり、時間部分が含まれない) 場合は、DATE
。第 1 引数が
DATETIME
(またはTIMESTAMP
) 値である場合と、第 1 引数がDATE
で、unit
値にHOURS
、MINUTES
、またはSECONDS
が使用されている場合は、DATETIME
です。それ以外の場合は文字列です。
必ず結果が
DATETIME
になるようにするには、CAST()
を使用すれば、第 1 引数をDATETIME
に変換できます。mysql> SELECT DATE_ADD('2018-05-01',INTERVAL 1 DAY); -> '2018-05-02' mysql> SELECT DATE_SUB('2018-05-01',INTERVAL 1 YEAR); -> '2017-05-01' mysql> SELECT DATE_ADD('2020-12-31 23:59:59', -> INTERVAL 1 SECOND); -> '2021-01-01 00:00:00' mysql> SELECT DATE_ADD('2018-12-31 23:59:59', -> INTERVAL 1 DAY); -> '2019-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('2025-01-01 00:00:00', -> INTERVAL '1 1:1:1' DAY_SECOND); -> '2024-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'
-
DATE_FORMAT(
date
,format
)format
文字列に従って、date
値を書式設定します。次のテーブルに示す指定子は、
format
文字列で使用できます。 書式指定子文字の前には、%
文字を付ける必要があります。 指定子は他の関数にも適用されます:STR_TO_DATE()
,TIME_FORMAT()
,UNIX_TIMESTAMP()
。指定子 説明 %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.16「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(
date
)DAY()
はDAYOFMONTH()
のシノニムです。 -
DAYNAME(
date
)date
に対応する曜日の名前を返します。 名前に使用される言語は、lc_time_names
システム変数 (セクション10.16「MySQL Server のロケールサポート」) の値で制御されます。mysql> SELECT DAYNAME('2007-02-03'); -> 'Saturday'
-
DAYOFMONTH(
date
)1
から31
までの範囲内でdate
に対応する日を返します。'0000-00-00'
や'2008-00-00'
のように日の部分がゼロの場合は、0
を返します。mysql> SELECT DAYOFMONTH('2007-02-03'); -> 3
-
DAYOFWEEK(
date
)date
の曜日インデックス (1
= Sunday、2
= Monday、…、7
= Saturday) を返します。 これらのインデックス値は、ODBC 標準に対応しています。mysql> SELECT DAYOFWEEK('2007-02-03'); -> 7
-
DAYOFYEAR(
date
)1
から366
までの範囲内でdate
に対応する通日を返します。mysql> SELECT DAYOFYEAR('2007-02-03'); -> 34
-
EXTRACT(
unit
FROMdate
)EXTRACT()
関数は、DATE_ADD()
またはDATE_SUB()
と同じ種類のunit
指定子を使用しますが、日付演算を実行するのではなく、日付から部分を抽出します。unit
引数の詳細は、時間間隔 を参照してください。mysql> SELECT EXTRACT(YEAR FROM '2019-07-02'); -> 2019 mysql> SELECT EXTRACT(YEAR_MONTH FROM '2019-07-02 01:02:03'); -> 201907 mysql> SELECT EXTRACT(DAY_MINUTE FROM '2019-07-02 01:02:03'); -> 20102 mysql> SELECT EXTRACT(MICROSECOND -> FROM '2003-01-02 10:30:00.000123'); -> 123
-
FROM_DAYS(
N
)日数
N
が指定され、DATE
値を返します。mysql> SELECT FROM_DAYS(730669); -> '2000-07-03'
古い日付では、
FROM_DAYS()
を慎重に使用してください。 グレゴリオ暦 (1582) の出現よりも前の値とともに使用することを目的に設計されていません。 セクション12.9「MySQL で使用されるカレンダー」を参照してください。 -
FROM_UNIXTIME(
unix_timestamp
[,format
])関数が文字列または数値のどちらのコンテキストで使用されているかに応じて、
unix_timestamp
引数の表現を'
またはYYYY-MM-DD hh:mm:ss
'YYYYMMDDhhmmss
形式の値として返します。unix_timestamp
は、'1970-01-01 00:00:00'
UTC 以降の秒数を表す内部タイムスタンプ値で、UNIX_TIMESTAMP()
関数によって生成されます。戻り値は、セッションのタイムゾーンで表されます。 (クライアントは、セクション5.1.15「MySQL Server でのタイムゾーンのサポート」 の説明に従ってセッションタイムゾーンを設定できます。)
format
文字列 (指定されている場合) は、DATE_FORMAT()
関数のエントリで説明されているのと同じ方法で結果を書式設定するために使用されます。mysql> SELECT FROM_UNIXTIME(1447430881); -> '2015-11-13 10:08:01' mysql> SELECT FROM_UNIXTIME(1447430881) + 0; -> 20151113100801 mysql> SELECT FROM_UNIXTIME(1447430881, -> '%Y %D %M %h:%i:%s %x'); -> '2015 13th November 10:08:01 2015'
注記UNIX_TIMESTAMP()
およびFROM_UNIXTIME()
を使用して UTC 以外のタイムゾーンの値と Unix タイムスタンプ値の間で変換する場合、マッピングは双方向では一対一ではないため、変換は失われます。 詳細は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'
-
HOUR(
time
)time
に対応する時を返します。 戻り値の範囲は、日付時間値の0
から23
までです。 ただし、TIME
値の範囲は実際にはもっと大きいため、HOUR
は23
よりも大きい値を返すことができます。mysql> SELECT HOUR('10:05:03'); -> 10 mysql> SELECT HOUR('272:59:59'); -> 272
-
LAST_DAY(
date
)日付または日付時間の値が指定され、月の最終日に対応する値を返します。 引数が無効である場合は、
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([
fsp
])LOCALTIME
およびLOCALTIME()
はNOW()
のシノニムです。 -
LOCALTIMESTAMP
,LOCALTIMESTAMP([
fsp
])LOCALTIMESTAMP
およびLOCALTIMESTAMP()
はNOW()
のシノニムです。 -
MAKEDATE(
year
,dayofyear
)指定された年と年間通算値から、日付を返します。
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
-
MAKETIME(
hour
,minute
,second
)hour
、minute
、およびsecond
引数から計算された時間値を返します。second
引数には小数部を含めることができます。mysql> SELECT MAKETIME(12,15,30); -> '12:15:30'
-
MICROSECOND(
expr
)0
から999999
までの範囲内の数値として、時間または日付時間式expr
からのマイクロ秒を返します。mysql> SELECT MICROSECOND('12:00:00.123456'); -> 123456 mysql> SELECT MICROSECOND('2019-12-31 23:59:59.000010'); -> 10
-
MINUTE(
time
)0
から59
までの範囲内で、time
に対応する分を返します。mysql> SELECT MINUTE('2008-02-03 10:05:03'); -> 5
-
MONTH(
date
)1
(1 月) から12
(12 月) の範囲内で、date
に対応する月を返します。'0000-00-00'
や'2008-00-00'
のように月の部分がゼロの場合は、0
を返します。mysql> SELECT MONTH('2008-02-03'); -> 2
-
MONTHNAME(
date
)date
に対応する月の完全名を返します。 名前に使用される言語は、lc_time_names
システム変数 (セクション10.16「MySQL Server のロケールサポート」) の値で制御されます。mysql> SELECT MONTHNAME('2008-02-03'); -> 'February'
-
NOW([
fsp
])関数が文字列または数値のどちらのコンテキストで使用されているかに応じて、現在の日時を
'
またはYYYY-MM-DD hh:mm:ss
'YYYYMMDDhhmmss
形式の値として返します。 値はセッションのタイムゾーンで表されます。0 から 6 までの小数秒精度を指定するために
fsp
引数が指定されている場合、戻り値にはその桁数の小数秒部分が含まれます。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()
の説明を参照してください。 -
PERIOD_ADD(
P
,N
)N
月を期間P
に (YYMM
またはYYYYMM
の書式で) 加算します。YYYYMM
の書式で値を返します。注記期間引数
P
は、日付値ではありません。mysql> SELECT PERIOD_ADD(200801,2); -> 200803
-
PERIOD_DIFF(
P1
,P2
)期間
P1
とP2
間の月数を返します。P1
およびP2
は、YYMM
またはYYYYMM
の書式にする必要があります。 期間引数P1
およびP2
は日付値ではないことに注意してください。mysql> SELECT PERIOD_DIFF(200802,200703); -> 11
-
QUARTER(
date
)1
から4
までの範囲内でdate
に対応する四半期を返します。mysql> SELECT QUARTER('2008-04-01'); -> 2
-
SECOND(
time
)0
から59
までの範囲内で、time
に対応する秒数を返します。mysql> SELECT SECOND('10:05:03'); -> 3
-
SEC_TO_TIME(
seconds
)TIME
値として、時、分、秒に変換されたseconds
引数を返します。 結果の範囲は、TIME
データ型の範囲に制約されます。 引数がその範囲外の値に対応している場合は、警告が発行されます。mysql> SELECT SEC_TO_TIME(2378); -> '00:39:38' mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938
-
STR_TO_DATE(
str
,format
)これは
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.2.2「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'
NO_ZERO_DATE
SQL モードが有効な場合、ゼロの日付は許可されません。 その場合、STR_TO_DATE()
はNULL
を返し、警告を生成します:mysql> SET sql_mode = ''; mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y'); +---------------------------------------+ | STR_TO_DATE('00/00/0000', '%m/%d/%Y') | +---------------------------------------+ | 0000-00-00 | +---------------------------------------+ mysql> SET sql_mode = 'NO_ZERO_DATE'; mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y'); +---------------------------------------+ | STR_TO_DATE('00/00/0000', '%m/%d/%Y') | +---------------------------------------+ | NULL | +---------------------------------------+ mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Warning Code: 1411 Message: Incorrect datetime value: '00/00/0000' for function str_to_date
注記週が月の境界を越えた場合は、年と週の組み合わせでは年と月を一意に識別できないため、
"%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
,expr2
)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'
-
SYSDATE([
fsp
])関数が文字列または数値のどちらのコンテキストで使用されているかに応じて、現在の日時を
'
またはYYYY-MM-DD hh:mm:ss
'YYYYMMDDhhmmss
形式の値として返します。0 から 6 までの小数秒精度を指定するために
fsp
引数が指定されている場合、戻り値にはその桁数の小数秒部分が含まれます。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()
に非決定的な特性があるということは、それを参照する式を評価する際にインデックスを使用できないことも意味します。 -
TIME(
expr
)時間または日付時間式
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
)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 つの引数を指定して呼び出す場合の順序と逆になります。 -
TIME_FORMAT(
time
,format
)これは
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_TO_SEC(
time
)秒に変換された
time
引数を返します。mysql> SELECT TIME_TO_SEC('22:23:00'); -> 80580 mysql> SELECT TIME_TO_SEC('00:39:38'); -> 2378
-
TO_DAYS(
date
)日付
date
が指定され、日数 (0 年以降の日数) を返します。mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS('2007-10-07'); -> 733321
TO_DAYS()
は、カレンダーが変更された際に失われた日が考慮されないため、グレゴリオ暦 (1582) の出現よりも前の値とともに使用するために設計されていません。 日付が 1582 よりも前の場合は (ほかのロケールでは、さらにあとの年になる可能性があります)、この関数の結果は信頼できません。 詳細は、セクション12.9「MySQL で使用されるカレンダー」,を参照してください。MySQL では セクション11.2「日時データ型」 のルールを使用して、日付の 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 サーバーモードが有効であるかどうかに関係なく当てはまります。 -
TO_SECONDS(
expr
)日付または日時
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.9「MySQL で使用されるカレンダー」,を参照してください。TO_DAYS()
と同様に、TO_SECONDS()
は セクション11.2「日時データ型」 のルールを使用して日付の 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([
date
])date
引数を指定せずにUNIX_TIMESTAMP()
をコールすると、'1970-01-01 00:00:00'
UTC 以降の秒数を表す Unix タイムスタンプが返されます。date
引数を指定してUNIX_TIMESTAMP()
をコールすると、'1970-01-01 00:00:00'
UTC 以降の秒数として引数の値が返されます。 サーバーは、date
をセッションタイムゾーンの値として解釈し、UTC の内部 Unix タイムスタンプ値に変換します。 (クライアントは、セクション5.1.15「MySQL Server でのタイムゾーンのサポート」 の説明に従ってセッションタイムゾーンを設定できます。)date
引数には、DATE
、DATETIME
またはTIMESTAMP
文字列、YYMMDD
,YYMMDDhhmmss
,YYYYMMDD
の数値またはYYYYMMDDhhmmss
形式を指定できます。 引数に時間部分が含まれている場合、オプションで小数秒部分を含めることができます。戻り値は、引数が指定されていない場合、または引数に小数秒部分が含まれていない場合は整数、小数秒部分を含む引数が指定されている場合は
DECIMAL
です。date
引数がTIMESTAMP
カラムの場合、UNIX_TIMESTAMP()
は内部タイムスタンプ値を直接返し、「string-to-Unix-timestamp」 の暗黙的な変換は行いません。引数値の有効範囲は、
TIMESTAMP
データ型の場合と同じです:'1970-01-01 00:00:01.000000'
UTC から'2038-01-19 03:14:07.999999'
UTC。UNIX_TIMESTAMP()
に範囲外の日付を渡すと、0
が返されます。mysql> SELECT UNIX_TIMESTAMP(); -> 1447431666 mysql> SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19'); -> 1447431619 mysql> SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19.012'); -> 1447431619.012
UNIX_TIMESTAMP()
およびFROM_UNIXTIME()
を使用して UTC 以外のタイムゾーンの値と Unix タイムスタンプ値の間で変換する場合、マッピングは双方向では一対一ではないため、変換は失われます。 たとえば、夏時間 (DST) などのローカルタイムゾーンの変更の規則により、UNIX_TIMESTAMP()
では UTC 以外のタイムゾーンで区別される 2 つの値を同じ Unix タイムスタンプ値にマップできます。FROM_UNIXTIME()
では、その値は元の値のいずれかにのみマップされます。 次に、MET
タイムゾーンで区別される値を使用する例を示します:mysql> SET time_zone = 'MET'; 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 | +---------------------------+
注記'MET'
や'Europe/Amsterdam'
などの名前付きタイムゾーンを使用するには、タイムゾーンテーブルが適切に設定されている必要があります。 その手順は、セクション5.1.15「MySQL Server でのタイムゾーンのサポート」を参照してください。UNIX_TIMESTAMP()
カラムを減算する場合は、符号付き整数にキャストできます。 セクション12.11「キャスト関数と演算子」を参照してください。 -
UTC_DATE
,UTC_DATE()
関数が文字列または数値のどちらのコンテキストで使用されているかに応じて、現在の UTC 日付を
'
またはYYYY-MM-DD
'YYYYMMDD
形式の値として返します。mysql> SELECT UTC_DATE(), UTC_DATE() + 0; -> '2003-08-14', 20030814
-
UTC_TIME
,UTC_TIME([
fsp
])関数が文字列または数値のどちらのコンテキストで使用されているかに応じて、現在の UTC 時間を
'hh:mm:ss'
またはhhmmss
形式の値として返します。0 から 6 までの小数秒精度を指定するために
fsp
引数が指定されている場合、戻り値にはその桁数の小数秒部分が含まれます。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
形式の値として返します。0 から 6 までの小数秒精度を指定するために
fsp
引数が指定されている場合、戻り値にはその桁数の小数秒部分が含まれます。mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0; -> '2003-08-14 18:08:04', 20030814180804.000000
-
WEEK(
date
[,mode
])この関数は、
date
に対応する週番号を返します。 2 つの引数を取る形式のWEEK()
を使用すると、週が日曜日と月曜日のどちらから始まるのか、および戻り値が0
から53
までと1
から53
までのどちらの範囲内であるのかを指定できます。mode
引数が省略された場合は、default_week_format
システム変数の値が使用されます。 セクション5.1.8「サーバーシステム変数」を参照してください。次の表では、
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'
-
WEEKDAY(
date
)date
に対応する曜日インデックス (0
= Monday、1
= Tuesday、…6
= Sunday) を返します。mysql> SELECT WEEKDAY('2008-02-03 22:23:00'); -> 6 mysql> SELECT WEEKDAY('2007-11-06'); -> 1
-
WEEKOFYEAR(
date
)1
から53
までの範囲内で、日付の暦週を返します。WEEKOFYEAR()
はWEEK(
に同等の互換性のある関数です。date
,3)mysql> SELECT WEEKOFYEAR('2008-02-20'); -> 8
-
YEAR(
date
)1000
から9999
までの範囲内で、date
に対応する年を返します。日付が「ゼロ」の場合は、0
を返します。mysql> SELECT YEAR('1987-01-01'); -> 1987
-
YEARWEEK(
,date
)YEARWEEK(
date
,mode
)日付に対応する年と週を返します。 結果の年と日付引数の年では、その年の最初と最後の週が異なる可能性があります。
mode
引数は、WEEK()
へのmode
引数とまったく同様に機能します。 単一引数構文では、mode
値 0 が使用されます。WEEK()
とは異なり、default_week_format
の値はYEARWEEK()
に影響しません。mysql> SELECT YEARWEEK('1987-01-01'); -> 198652
WEEK()
はその後、指定された年のコンテキストで週を返すため、週番号はオプションの引数0
または1
を付けた場合にWEEK()
関数で返される数字 (0
) とは異なります。