このセクションでは、時間値の処理に使用できる関数について説明します。各日付日時タイプが持つ値の範囲の説明と、値が指定されている場合の有効なフォーマットの説明は 項10.3. 「日付と時刻タイプ」 をご覧ください。
日付関数の使用例です。次のクエリはすべての行を、過去
30 日以内の date_col
で選択します :
mysql>SELECT
->something
FROMtbl_name
WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <=
date_col
;
またこのクエリは、将来欺く日付で行を選択しますのでご注意ください。
日付値を受け入れる関数は通常、日付時刻値を受け入れ、時刻の部分を無視します。そして時刻値を受け入れる関数は通常、日付時刻値を受け入れ、日付の部分を無視します。
現在の日付または時刻をそれぞれ戻す関数は、クエリ実行の開始時点で、各クエリにつき一度だけ評価されます。つまり、単一クエリ内での、NOW()
などの関数の複数の参照は、常に同じ結果を生成します
( 我々の目的に関しては、単一クエリはストアド
ルーチンまたはトリガ、およびそのルーチン /
トリガによって呼び出されたサブルーチンへの呼び出しも含みます
) 。またこの法則は、CURDATE()
、CURTIME()
、UTC_DATE()
、UTC_TIME()
、UTC_TIMESTAMP()
、およびそれらのシノニムにも適合します。
CURRENT_TIMESTAMP()
、CURRENT_TIME()
、CURRENT_DATE()
、そして
FROM_UNIXTIME()
関数は、time_zone
接続の現行時間帯での値を戻し、それらはシステム環境変数の値として利用できます。また、UNIX_TIMESTAMP()
は、その引数が現行時間帯での日付時刻値であると想定します。詳細は
項4.10.8. 「MySQL サーバのタイム ゾーン サポート」 を参照してください。
日付関数のあるものは、その他とは異なり、「zero」
日付、または '2001-11-00'
のような不完全な日付とも使用できます。日付の一部を摘出する関数は通常、不完全な日付でも問題ありません。例
:
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
ADDDATE(
,
date
,INTERVAL
expr
unit
)ADDDATE(
expr
,days
)
2 番目の引数の INTERVAL
フォームで呼び出される際、ADDDATE()
は DATE_ADD()
のシノニムになります。関連する関数
SUBDATE()
は DATE_SUB()
のシノニムです。INTERVAL
unit
引数の詳細については、DATE_ADD()
のディスカッションをご覧ください。
mysql>SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY);
-> '1998-02-02' mysql>SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY);
-> '1998-02-02'
2 番目の引数の days
フォームで呼び出される場合、MySQL はそれを
expr
に加えるために、整数の日数として扱います。
mysql> SELECT ADDDATE('1998-01-02', 31);
-> '1998-02-02'
ADDTIME()
は、expr2
を
expr1
に加え、その結果を戻します。expr1
は時刻式、または日付時刻式で、expr2
は時刻式です。
mysql>SELECT ADDTIME('1997-12-31 23:59:59.999999',
->'1 1:1:1.000002');
-> '1998-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
が指定する時間帯に変換し、結果の値を戻します。時間帯は、項4.10.8. 「MySQL サーバのタイム ゾーン サポート」
で説明されているように指定されています。引数が無効な場合、この関数は
NULL
を戻します。
値が、from_tz
から UTC
に変換される際に TIMESTAMP
でサポートされている範囲から外れた場合、変換は行われません。TIMESTAMP
の範囲は 項10.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'
などの、名前付きの時間帯を使用するには、時間帯テーブルが正確に設定されている必要があります。手順については
項4.10.8. 「MySQL サーバのタイム ゾーン サポート」 をご覧ください。
他のテーブルが LOCK TABLES
でロックされている間に
CONVERT_TZ()
を使用したい場合は、mysql.time_zone_name
テーブルもロックする必要があります。
関数がストリングで使用されているか、もしくは数値コンテキストで使用されているかによって、現在の日付を
'YYYY-MM-DD'
または
YYYYMMDD
フォーマットの値で戻します。
mysql>SELECT CURDATE();
-> '1997-12-15' mysql>SELECT CURDATE() + 0;
-> 19971215
CURRENT_DATE
および
CURRENT_DATE()
は
CURDATE()
のシノニムです。
関数がストリングで使用されているか、もしくは数値コンテキストで使用されているかによって、現在の時刻を
'HH:MM:SS'
または
HHMMSS
フォーマットの値で戻します。値は現在の時間帯で表現されています。
mysql>SELECT CURTIME();
-> '23:50:26' mysql>SELECT CURTIME() + 0;
-> 235026
CURRENT_TIME
および
CURRENT_TIME()
は
CURTIME()
のシノニムです。
CURRENT_TIMESTAMP
,
CURRENT_TIMESTAMP()
CURRENT_TIMESTAMP
および
CURRENT_TIMESTAMP()
は
NOW()
のシノニムです。
日付、または日付時刻式
expr
の日付部分を摘出します。
mysql> SELECT DATE('2003-12-31 01:02:03');
-> '2003-12-31'
DATEDIFF()
は、ひとつの日付から他の日付への日数の値として表現された
expr1
–
expr2
を戻します。expr1
および
expr2
は日付または日付と時刻の表現です。値の日付部分のみが計算に使用されます。
mysql>SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');
-> 1 mysql>SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31');
-> -31
DATE_ADD(
,
date
,INTERVAL
expr
unit
)DATE_SUB(
date
,INTERVAL
expr
unit
)
これらの関数は日付演算を行います。date
は、開始日を指定する DATETIME
または 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.MICROSECONDS' |
MINUTE_SECOND |
'MINUTES:SECONDS' |
HOUR_MICROSECOND |
'HOURS.MICROSECONDS' |
HOUR_SECOND |
'HOURS:MINUTES:SECONDS' |
HOUR_MINUTE |
'HOURS:MINUTES' |
DAY_MICROSECOND |
'DAYS.MICROSECONDS' |
DAY_SECOND |
'DAYS HOURS:MINUTES:SECONDS' |
DAY_MINUTE |
'DAYS HOURS:MINUTES' |
DAY_HOUR |
'DAYS HOURS' |
YEAR_MONTH |
'YEARS-MONTHS' |
MySQL は、expr
フォーマットにおいてはいかなる句読区切り記号の使用も許容します。上記の表の区切り記号は提案にすぎません。date
引数が DATE
値であり、行う計算が YEAR
、MONTH
、および
DAY
部のみ ( 時刻部分はなし )
を含む場合は、結果は DATE
値になります。他の場合は、結果は
DATETIME
値になります。
また、日付演算は、INTERVAL
を
+
または -
演算子と共に使用しても行うことができます :
date
+ INTERVALexpr
unit
date
- INTERVALexpr
unit
INTERVAL
は、一方の表現が日付か日付時刻値であれば、どちら側の
expr
unit
+
演算子でも使用できます。-
演算子に関しては、INTERVAL
は、インターバルから日付や日付日時値を摘出しても意味がないため、右側でのみ使用できます。
expr
unit
mysql>SELECT '1997-12-31 23:59:59' + INTERVAL 1 SECOND;
-> '1998-01-01 00:00:00' mysql>SELECT INTERVAL 1 DAY + '1997-12-31';
-> '1998-01-01' mysql>SELECT '1998-01-01' - INTERVAL 1 SECOND;
-> '1997-12-31 23:59:59' mysql>SELECT DATE_ADD('1997-12-31 23:59:59',
->INTERVAL 1 SECOND);
-> '1998-01-01 00:00:00' mysql>SELECT DATE_ADD('1997-12-31 23:59:59',
->INTERVAL 1 DAY);
-> '1998-01-01 23:59:59' mysql>SELECT DATE_ADD('1997-12-31 23:59:59',
->INTERVAL '1:1' MINUTE_SECOND);
-> '1998-01-01 00:01:00' mysql>SELECT DATE_SUB('1998-01-01 00:00:00',
->INTERVAL '1 1:1:1' DAY_SECOND);
-> '1997-12-30 22:58:59' mysql>SELECT DATE_ADD('1998-01-01 00:00:00',
->INTERVAL '-1 10' DAY_HOUR);
-> '1997-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
値を、時刻ではなく経過時間として解釈するやり方に相似しています。
時間部分を含むなにかを日付値に追加、または日付値から摘出する場合、結果は自動的に日付時刻値に変換されます :
mysql>SELECT DATE_ADD('1999-01-01', INTERVAL 1 DAY);
-> '1999-01-02' mysql>SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR);
-> '1999-01-01 01:00:00'
MONTH
、YEAR_MONTH
、または YEAR
を加え、結果の日付が新しい月の最大日数より大きな日を持つ場合、その日は新しい月の最大日数に調整されます。
mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
-> '1998-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
date
値を
format
ストリングに基づいてフォーマットします。
次の指定子は 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 )
、週の開始は日曜日 |
%u |
週
(00 ..53 )、週の開始は月曜日 |
%V |
週 (01 ..53 )
、週の開始は日曜日で、%X
と使用 |
%v |
週 (01 ..53 )
、週の開始は月曜日で、%x
と使用 |
%W |
曜日名 (Sunday ..Saturday ) |
%w |
曜日 (0 =Sunday..6 =Saturday) |
%X |
年間の週、週の始まりは日曜日、週、数字、4 桁 ;
%V と使用 |
%x |
年間の週、週の始まりは月曜日、数字、4
桁、%v と使用 |
%Y |
年、数字、4 桁 |
%y |
年、数字 ( 2 桁 ) |
%% |
リテラル ‘% ’ 文字 |
% |
x 、上記にないすべての
‘x ’ |
MySQL は '2004-00-00'
のような不完全な日付の格納を許可するため、月と日にちの指定子の範囲は
0 から始まります。
MySQL 5.1.12
から、日にちおよび月の名称に使用される言語と、省略後は、lc_time_names
システム環境変数 ( 項4.10.9. 「MySQL サーバのローケル サポート」 )
の値によって管理されます。
MySQL 5.1.15 からは、DATE_FORMAT()
は文字セットを持つストリングと、character_set_connection
および collation_connection
によって提示された照合を戻し、非 ASCII
文字を含む月と曜日の名前を戻せるようになりました。5.1.15
の前は、戻り値はバイナリ
ストリングでした。
mysql>SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997' mysql>SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00' mysql>SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j'); -> '4th 97 Sat 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
,INTERVAL
expr
unit
)
DATE_ADD()
参照。
DAY()
は DAYOFMONTH(
のシノニムです。
date
に対して曜日の名前を戻します。MySQL 5.1.12
からは、名前に使用される言語は、lc_time_names
システム環境変数 ( 項4.10.9. 「MySQL サーバのローケル サポート」 )
の値によって管理されます。
mysql> SELECT DAYNAME('1998-02-05');
-> 'Thursday'
0
から 31
の範囲内の日にちを、date
に対して戻します。
mysql> SELECT DAYOFMONTH('1998-02-03');
-> 3
date
( 1
=
Sunday 、2
= Monday 、…
、7
= Saturday )
に対する曜日のインデックスを戻します。これらのインデックス値は、ODBC
標準に対応しています。
mysql> SELECT DAYOFWEEK('1998-02-03');
-> 3
1
から 366
の範囲内の通日を、date
に対して戻します。
mysql> SELECT DAYOFYEAR('1998-02-03');
-> 34
EXTRACT()
関数は、DATE_ADD()
または
DATE_SUB()
と同様の装置指定子を使用しますが、データ演算を行うのではなく、データから一部を摘出します。
mysql>SELECT EXTRACT(YEAR FROM '1999-07-02');
-> 1999 mysql>SELECT EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03');
-> 199907 mysql>SELECT EXTRACT(DAY_MINUTE FROM '1999-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(729669);
-> '1997-10-07'
FROM_DAYS()
を古い日付で注意深く使用します。グレゴリオ暦
( 1582 )
の出現を優先する値と共に使用することが目的ではありません。詳細は
項11.6. 「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(875996580);
-> '1997-10-04 22:23:00' mysql>SELECT FROM_UNIXTIME(875996580) + 0;
-> 19971004222300 mysql>SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),
->'%Y %D %M %h:%i:%s %x');
-> '2003 6th August 06:22:58 2003'
注記 :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()
への最初の引数としても使用でき、その場合、関数は
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
の正時 ( hour )
を戻します。戻り値の範囲は、時刻値の
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()
LOCALTIMESTAMP
および
LOCALTIMESTAMP()
は
NOW()
のシノニムです。
日付、提示された年、そして通日の値を戻します。dayofyear
は 0
より大きくなければならず、さもなければ結果は
NULL
になります。
mysql>SELECT MAKEDATE(2001,31), MAKEDATE(2001,32);
-> '2001-01-31', '2001-02-01' mysql>SELECT MAKEDATE(2001,365), MAKEDATE(2004,365);
-> '2001-12-31', '2004-12-30' mysql>SELECT MAKEDATE(2001,0);
-> NULL
hour
、minute
、および
second
引数から計算された時間値を戻します。
mysql> SELECT MAKETIME(12,15,30);
-> '12:15:30'
時間または日付時刻式 expr
からのマイクロ秒を、0
から
999999
までの範囲の数値として戻します。
mysql>SELECT MICROSECOND('12:00:00.123456');
-> 123456 mysql>SELECT MICROSECOND('1997-12-31 23:59:59.000010');
-> 10
0
から 59
の範囲内で、time
の分数を戻します。
mysql> SELECT MINUTE('98-02-03 10:05:03');
-> 5
0
から 12
の範囲内で、date
の月を戻します。
mysql> SELECT MONTH('1998-02-03');
-> 2
date
の月の完全名を戻します。MySQL 5.1.12
からは、名前に使用される言語は、lc_time_names
システム環境変数 ( 項4.10.9. 「MySQL サーバのローケル サポート」 )
の値によって管理されます。
mysql> SELECT MONTHNAME('1998-02-05');
-> 'February'
関数がストリングで使用されているか、もしくは数値コンテキストで使用されているかによって、現在の日付を
'YYYY-MM-DD HH:MM:SS'
または
YYYYMMDDHHMMSS
フォーマットの値で戻します。値は現在の時間帯で表現されています。
mysql>SELECT NOW();
-> '1997-12-15 23:50:26' mysql>SELECT NOW() + 0;
-> 19971215235026
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 | +---------------------+----------+---------------------+
ふたつの関数の違いに関する詳細は、SYSDATE()
の説明をご覧ください。
N
月を、期間
P
に加えます (
フォーマットは YYMM
または
YYYYMM
) 。フォーマット
YYYYMM
で値を戻します。期間引数
P
は日付値ではありません
のでご注意ください。
mysql> SELECT PERIOD_ADD(9801,2);
-> 199803
期間 P1
と
P2
間の月の数を戻します。P1
および P2
は、YYMM
または
YYYYMM
のフォーマットになります。期間引数
P1
および
P2
は日付値ではありませんのでご注意ください。
mysql> SELECT PERIOD_DIFF(9802,199703);
-> 11
date
の四半期を
1
から 4
の範囲内で戻します。
mysql> SELECT QUARTER('98-04-01');
-> 2
0
から 59
の範囲内で、time
の秒数を戻します。
mysql> SELECT SECOND('10:05:03');
-> 3
関数がストリングで使用されているか、もしくは数値コンテキストで使用されているかによって、正時、分、秒に変換された
seconds
引数を、'HH:MM:SS'
または
HHMMSS
のフォーマットの値で戻します。
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
に含まれる日付、時刻、または日付時刻値は、format
で示されるフォーマットで提供してください。format
で使用できる指定子については、DATE_FORMAT()
関数の説明を参照してください。str
が不当な日付、時刻、または日付時刻値を含む場合は、STR_TO_DATE()
は NULL
を戻します。また、不当な値は警告を生成します。
日付値の部分を確認する範囲は、項10.3.1. 「DATETIME
、DATE
、そして
TIMESTAMP
タイプ」
で説明されている通りです。つまり、例えば、「zero」
日付、または部分の値が 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
,INTERVAL
expr
unit
)SUBDATE(
expr
,days
)
2 番目の引数の INTERVAL
フォームで呼び出される際、SUBDATE()
は DATE_SUB()
のシノニムになります。INTERVAL
unit
引数の詳細については、DATE_ADD()
のディスカッションをご覧ください。
mysql>SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
-> '1997-12-02' mysql>SELECT SUBDATE('1998-01-02', INTERVAL 31 DAY);
-> '1997-12-02'
2 番目のフォームは、days
に整数値を使用することを許可します。そのような場合は、日付または日付時刻式
expr
から日数が減算されると解釈されます。
mysql> SELECT SUBDATE('1998-01-02 12:00:00', 31);
-> '1997-12-02 12:00:00'
SUBTIME()
は、expr1
と同じフォーマットで値として表現された
expr1
–
expr2
を戻します。expr1
は時刻または日付時刻式であり、expr2
時刻表現です。
mysql>SELECT SUBTIME('1997-12-31 23:59:59.999999','1 1:1:1.000002');
-> '1997-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
フォーマットの値で戻します。
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()
のエイリアスになるようにしてください。
時刻、または日付時刻式
expr
の時刻部分を摘出し、ストリングとして戻します。
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
は時刻、または日付時刻式ですが、双方とも同じタイプであることが重要です。
mysql>SELECT TIMEDIFF('2000:01:01 00:00:00',
->'2000:01:01 00:00:00.000001');
-> '-00:00:00.000001' mysql>SELECT TIMEDIFF('1997-12-31 23:59:59.000001',
->'1997-12-30 01:01:01.000002');
-> '46:58:57.999999'
TIMESTAMP(
,
expr
)TIMESTAMP(
expr1
,expr2
)
単一引数では、この関数は日付または日付時刻式
expr
を日付時刻値として戻します。ふたつの引数では、時刻式
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
引数によって提示されます :
FRAC_SECOND
、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_expr1
および
datetime_expr2
間の整数の差を戻します。結果のユニットは、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
これは 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('1997-10-07');
-> 729669
TO_DAYS()
は、カレンダーが変更された際に失われた日を考慮しないので、グレゴリオ暦
( 1582 )
の出現を優先される値と使用する目的はありません。1582 より前の日付
( または他のロケールでの後の年 )
に関しては、この関数からの結果は信頼できません。詳細は
項11.6. 「MySQL が使用するカレンダーは ?」 をご覧ください。
MySQL は 項10.3. 「日付と時刻タイプ」
のルールを使用して、日付の 2 桁の年の値を 4
桁のフォームに変換することに留意してください。例えば、'1997-10-07'
と '97-10-07'
は同一の日付と考えられます :
mysql> SELECT TO_DAYS('1997-10-07'), TO_DAYS('97-10-07');
-> 729669, 729669
UNIX_TIMESTAMP()
,
UNIX_TIMESTAMP(
date
)
引数なしで呼び出された場合、Unix
タイムスタンプ ( '1970-01-01
00:00:00'
UTC 以来の秒数 )
を符号なしの整数として戻します。UNIX_TIMESTAMP()
が date
引数で呼び出された場合は、'1970-01-01
00:00:00'
UTC
以後の秒として引数の値が戻されます。date
は、DATE
ストリング、DATETIME
ストリング、TIMESTAMP
、またはフォーマット YYMMDD
もしくは YYYYMMDD
内のナンバーである場合があります。サーバは
date
を現在の時間帯の値として解釈し、UTC
の内部値に変換します。クライアントは、項4.10.8. 「MySQL サーバのタイム ゾーン サポート」
で説明されているように、独自の時間帯を設定することができます。
mysql>SELECT UNIX_TIMESTAMP();
-> 882226357 mysql>SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
-> 875996580
UNIX_TIMESTAMP
が
TIMESTAMP
カラムに使用される際、関数は明示的な
「string-to-Unix-timestamp」
の変換なしに、内部タイムスタンプ値を直接戻します。UNIX_TIMESTAMP()
に範囲外の日付を渡すと、0
が戻されます。
注記 :UNIX_TIMESTAMP()
および
FROM_UNIXTIME()
を使って
TIMESTAMP
値と Unix
タイムスタンプ値間を変換する場合、マッピングは双方向に対して
1 対 1
ではないので、変換は高損失になります。例えば、現地時間帯の変更に対する変換のため、ふたつの
UNIX_TIMESTAMP()
がふたつの
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()
カラムを減算するには、結果を符号付きの整数にキャストする方法もあります。詳細は
項11.8. 「キャスト関数と演算子」
を参照してください。
関数がストリングで使用されているか、もしくは数値コンテキストで使用されているかによって、現在の
UTC 日付を 'YYYY-MM-DD'
または YYYYMMDD
フォーマットの値で戻します。
mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
-> '2003-08-14', 20030814
関数がストリングで使用されているか、もしくは数値コンテキストで使用されているかによって、現在の
UTC 時刻を 'HH:MM:SS'
または HHMMSS
フォーマットの値で戻します。
mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
-> '18:07:53', 180753
UTC_TIMESTAMP
,
UTC_TIMESTAMP()
関数がストリングで使用されているか、もしくは数値コンテキストで使用されているかによって、現在の
UTC 日付を 'YYYY-MM-DD
HH:MM:SS'
または
YYYYMMDDHHMMSS
フォーマットの値で戻します。
mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
-> '2003-08-14 18:08:04', 20030814180804
この関数は date
に週の数を戻します。WEEK()
の、引数がふたつのフォームによって、週が日曜で始まるか、月曜で始まるか、また、戻り値の範囲は
0
から 53
か、1
から 53
かを指定することが可能です。mode
引数が省略された場合は、default_week_format
システム環境変数の値が使用されます。詳細は
項4.2.3. 「システム変数」
を参照してください。
次のテーブルは、mode
引数がどのように作用するかを示したものです。
開始日 | |||
モード | 曜日 | 範囲 | Week 1 は下記の最初の週… |
0 | 日曜日 | 0-53 | この年の日曜日 |
1 | 月曜日 | 0-53 | この年は 3 日以上 |
2 | 日曜日 | 1-53 | この年は日曜日 |
3 | 月曜日 | 1-53 | この年は 3 日以上 |
4 | 日曜日 | 0-53 | この年は 3 日以上 |
5 | 月曜日 | 0-53 | この年は月曜日 |
6 | 日曜日 | 1-53 | この年は 3 日以上 |
7 | 月曜日 | 1-53 | この年は月曜日 |
mysql>SELECT WEEK('1998-02-20');
-> 7 mysql>SELECT WEEK('1998-02-20',0);
-> 7 mysql>SELECT WEEK('1998-02-20',1);
-> 8 mysql>SELECT WEEK('1998-12-31',1);
-> 53
日付が先年の最後の週に該当する場合、2
、3
、6
、または
7
をオプションの
mode
引数として使用しなければ、MySQL は
0
を戻すので注意してください :
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
-> 2000, 0
与えられた日付が 1999 年の 52
週目に発生するため、MySQL は
WEEK()
関数に 52
を戻すべきだという意見もあります。しかし当社では、関数が
「与えらた年の週の」
を戻すべきだと考え、0
を戻しています。これにより、日付から日にち部分を摘出する他の関数と併用する際に、WEEK()
関数をより信頼して使用できるようになっています。
結果において、与えられた日付の週の最初の日を含む年の評価をしたい場合は、0
、2
、5
、または
7
を、オプションの
mode
引数として使用してください。
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('1998-02-03 22:23:00');
-> 1 mysql>SELECT WEEKDAY('1997-11-05');
-> 2
1
から 53
の範囲で、日付の暦週を返します。WEEKOFYEAR()
は WEEK(
に等価な互換性の関数です。
date
,3)
mysql> SELECT WEEKOFYEAR('1998-02-20');
-> 8
0
から 9999
の範囲、または 「zero」 日付には
0
で、date
の年を戻します。
mysql> SELECT YEAR('98-02-03');
-> 1998
YEARWEEK(
,
date
)YEARWEEK(
date
,mode
)
日付の年と週を戻します。mode
引数は、WEEK()
への
mode
引数とまったく同様に作用します。結果の年は、日付引数の年によって、年の最初の週と、最後の週で異なる場合があります。
mysql> SELECT YEARWEEK('1987-01-01');
-> 198653
週の数は、WEEK()
が提示された年のコンテキストの週を戻す場合、WEEK()
関数がオプションの引数 0
または 1
に戻すもの (
0
) よって異なります。