このセクションでは、時間に関係する値の操作に使用できる関数について説明します。 日付と時刻の各データ型の範囲と、値を指定するときの有効な形式については、項6.2.2. 「日付と時刻型」を参照してください。
日付関数の使用例を次に示します。このクエリでは、過去
30 日以内の日付の date_col
値を持つすべてのレコードが選択されます。
mysql> SELECT something FROM tbl_name
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
(このクエリでは、将来の日付を持つレコードも選択されます。)
日付値を前提とする関数は、通常、日付時刻値を受け入れて、時刻部分を無視します。時刻値を前提とする関数は、通常、日付時刻値を受け入れて、日付部分を無視します。
現在の日付または時刻をそれぞれ返す関数は、クエリごとに、そのクエリの開始時に
1 回だけ評価されます。したがって、1
つのクエリ内で NOW()
などの関数を何度も参照しても、常に同じ結果になります。この原則は、CURDATE()
、CURTIME()
、UTC_DATE()
、UTC_TIME()
、UTC_TIMESTAMP()
、およびこれらのあらゆるシノニムに同様に適用されます。
以下の関数の説明で示している戻り値の範囲は、完全な日付に対して適用されます。日付が
``ゼロ'' 値であったり、'2001-11-00'
などの不完全な日付である場合、日付の一部を取り出す関数では
0
が返ります。たとえば、DAYOFMONTH('2001-11-00')
からは 0
が返ります。
ADDDATE(date,INTERVAL expr type)
,
ADDDATE(expr,days)
2 番目の引数の INTERVAL
を指定する形式で呼び出した場合、ADDDATE()
は DATE_ADD()
とシノニムになる。関連する関数
SUBDATE()
は
DATE_SUB()
のシノニム。
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 番目の構文は MySQL 4.1.1
以降で使用できる。expr
には日付式か日付時刻式を指定し、days
には expr
に加える日数を指定する。
mysql> SELECT ADDDATE('1998-01-02', 31);
-> '1998-02-02'
ADDTIME(expr,expr2)
ADDTIME()
では、expr
に
expr2
を加えた結果が返される。 expr
には日付式か日付時刻式を指定し、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'
ADDTIME()
は MySQL 4.1.1
で追加された。
CURDATE()
文字列と数値のどちらのコンテキストで使用されているかに応じて、'YYYY-MM-DD'
または YYYYMMDD
形式の値として、現在の日付を返す。
mysql>SELECT CURDATE();
-> '1997-12-15' mysql>SELECT CURDATE() + 0;
-> 19971215
CURRENT_DATE
,
CURRENT_DATE()
CURRENT_DATE
と
CURRENT_DATE()
は
CURDATE()
のシノニム。
CURTIME()
文字列と数値のどちらのコンテキストで使用されているかに応じて、'HH:MM:SS'
または HHMMSS
形式の値として、現在の時刻を返す。
mysql>SELECT CURTIME();
-> '23:50:26' mysql>SELECT CURTIME() + 0;
-> 235026
CURRENT_TIME
,
CURRENT_TIME()
CURRENT_TIME
と
CURRENT_TIME()
は
CURTIME()
のシノニム。
CURRENT_TIMESTAMP
,
CURRENT_TIMESTAMP()
CURRENT_TIMESTAMP
と
CURRENT_TIMESTAMP()
は
NOW()
のシノニム。
DATE(expr)
日付式または日付時刻式 expr
の日付部分を取り出す。
mysql> SELECT DATE('2003-12-31 01:02:03');
-> '2003-12-31'
DATE()
は MySQL 4.1.1
以降で使用できる。
DATEDIFF(expr,expr2)
DATEDIFF()
は開始日
expr
と終了日
expr2
との間の日数を返す。
expr
と expr2
には、日付式か、日付時刻式を指定する。
計算は値の日付部分のみに基づいて行われる。
mysql>SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');
-> 1 mysql>SELECT DATEDIFF('1997-11-31 23:59:59','1997-12-31');
-> -30
DATEDIFF()
は MySQL 4.1.1
で追加された。
DATE_ADD(date,INTERVAL expr type)
,
DATE_SUB(date,INTERVAL expr type)
これらの関数では日付演算が実行される。
MySQL バージョン 3.23
以降では、+
演算子のどちらかの側にINTERVAL expr
type
を使用できる。この場合、もう一方の側の式には日付値または日付時刻値を指定する。
-
演算子を使用する場合は、演算子の右側にのみ
INTERVAL expr type
を使用できる。これは、日付値または日付時刻値を間隔から差し引いても意味がないため(下の例を参照)。
date
には、開始日とする
DATETIME
または
DATE
値を指定する。expr
には、開始日に加える、または開始日から差し引く間隔値を表す式を文字列として指定する。先頭に
‘-
’
を付けて負の間隔を表すこともできる。type
には、式の解釈方法を示すキーワードを指定する。
次の表に、type
引数と
expr
引数がどのように関連するかを示す。
type 値
|
前提となる expr
の形式
|
SECOND |
SECONDS |
MINUTE |
MINUTES |
HOUR |
HOURS |
DAY |
DAYS |
MONTH |
MONTHS |
YEAR |
YEARS |
MINUTE_SECOND |
'MINUTES:SECONDS' |
HOUR_MINUTE |
'HOURS:MINUTES' |
DAY_HOUR |
'DAYS HOURS' |
YEAR_MONTH |
'YEARS-MONTHS' |
HOUR_SECOND |
'HOURS:MINUTES:SECONDS' |
DAY_MINUTE |
'DAYS HOURS:MINUTES' |
DAY_SECOND |
'DAYS HOURS:MINUTES:SECONDS' |
DAY_MICROSECOND |
'DAYS.MICROSECONDS' |
HOUR_MICROSECOND |
'HOURS.MICROSECONDS' |
MINUTE_MICROSECOND |
'MINUTES.MICROSECONDS' |
SECOND_MICROSECOND |
'SECONDS.MICROSECONDS' |
MICROSECOND |
'MICROSECONDS' |
type
値
DAY_MICROSECOND
、HOUR_MICROSECOND
、MINUTE_MICROSECOND
、SECOND_MICROSECOND
、MICROSECOND
は、MySQL 4.1.1 以降で使用できる。
MySQL では、expr
の形式で任意の句読記号を使用できる。
上の表では、これらの句読記号の一部を示している。date
引数に DATE
型の値を指定し、計算に
YEAR
、MONTH
、DAY
部分のみを組み込む(つまり、時刻部分は含めない)場合、結果は
DATE
型の値になる。それ以外の場合、DATETIME
型の値が返される。
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'
指定した間隔値が短すぎる場合(つまり、type
キーワードによって想定される間隔部分の一部を含んでいない場合)、MySQL
では、間隔値の左端の部分がないとみなされる。たとえば、type
を DAY_SECOND
として指定すると、expr
の値は、日、時、分、秒の各部で構成されると想定される。この場合、'1:10'
のような値を指定すると、値は日部分と時間部分を持たず、分と秒を表すと解釈される。つまり、'1:10'
DAY_SECOND
と指定した場合、'1:10'
MINUTE_SECOND
と指定した場合と同じように解釈されることになる。これは、MySQL
で TIME
値が 1
日の時刻ではなく経過時間として解釈されるのに類する。
注意:時刻部分を持つ値を日付値に加えたり、日付値から差し引いたりすると、結果は自動的に日付時刻型の値に変換される。
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'
誤った日付を使用すると、結果は
NULL
になる。MONTH
、YEAR_MONTH
、YEAR
のいずれかを加えた結果の日付が、新しい月の最大日数より大きい場合、新しい月の最大日数に調整される。
mysql> SELECT DATE_ADD('1998-01-30', interval 1 month);
-> '1998-02-28'
注意: 上記の例で、キーワード
INTERVAL
と type
指定子はケース非依存。
DATE_FORMAT(date,format)
format
文字列に合わせて、date
値を形式設定する。format
文字列では、次の指定子を使用できる。
指定子 | 説明 |
%M |
月の名前(January ..December )。 |
%W |
曜日名(Sunday ..Saturday )。 |
%D |
英語のサフィックス付きの日付(0th 、1st 、2nd 、3rd
など)。 |
%Y |
4 桁の数値で表した年。 |
%y |
2 桁の数値で表した年。 |
%X |
日曜日を週の最初の日とした場合の週に使用する、4
桁の数値で表した年。%V
と組み合わせて使用。 |
%x |
月曜日を週の最初の日とした場合の週に使用する、4
桁の数値で表した年。%v
と組み合わせて使用。 |
%a |
略式の曜日名(Sun ..Sat )。 |
%d |
数値で表した日付(00 ..31 )。 |
%e |
数値で表した日付(0 ..31 )。 |
%m |
数値で表した月(00 ..12 )。 |
%c |
数値で表した月(0 ..12 )。 |
%b |
略式の月名(Jan ..Dec )。 |
%j |
年間を通した日にち(001 ..366 )。 |
%H |
時(00 ..23 )。 |
%k |
時(0 ..23 )。 |
%h |
時(01 ..12 )。 |
%I |
時(01 ..12 )。 |
%l |
時(1 ..12 )。 |
%i |
数値で表した分(00 ..59 )。 |
%r |
12 時間形式の時刻(hh:mm:ss に続けて
AM または
PM )。 |
%T |
24 時間形式の時刻(hh:mm:ss )。 |
%S |
秒(00 ..59 )。 |
%s |
秒(00 ..59 )。 |
%f |
マイクロ秒(000000 ..999999 )。 |
%p |
AM または PM
|
%w |
曜日(0 =Sunday..6 =Saturday)。 |
%U |
日曜日を週の最初の日とした場合の週(00 ..53 )。 |
%u |
月曜日を週の最初の日とした場合の週(00 ..53 )。 |
%V |
日曜日を週の最初の日とした場合の週(01 ..53 )。%X
と組み合わせて使用。 |
%v |
月曜日を週の最初の日とした場合の週(01 ..53 )。%x
と組み合わせて使用。 |
%% |
リテラルの ‘% ’。 |
その他の文字はいずれも、解釈されずにそのまま結果にコピーされる。
%f
形式指定子は MySQL 4.1.1
以降で使用できる。
MySQL バージョン 3.23
以降では、形式指定子文字の前に
‘%
’
文字を挿入する必要がある。それより前のバージョンの
MySQL では、‘%
’
の使用は任意。
月と日の指定子の範囲がゼロから始まっている理由は、MySQL
3.23 以降では、'2004-00-00'
のような不完全な日付の格納が許容されるため。
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'
DAY(date)
DAY()
は DAYOFMONTH()
のシノニム。 MySQL 4.1.1 以降で使用できる。
DAYNAME(date)
date
に指定された日付の曜日名を返す。
mysql> SELECT DAYNAME('1998-02-05');
-> 'Thursday'
DAYOFMONTH(date)
date
に指定された日付に対し、1
〜
31
の範囲の日にちを返す。
mysql> SELECT DAYOFMONTH('1998-02-03');
-> 3
DAYOFWEEK(date)
date
の曜日インデックス(1
=
日曜、2
= 月曜、...
7
=
土曜)を返す。これらのインデックス値は
ODBC 標準に対応している。
mysql> SELECT DAYOFWEEK('1998-02-03');
-> 3
DAYOFYEAR(date)
date
に指定された日付に対し、1
〜
366
の範囲の年間を通した日にちを返す。
mysql> SELECT DAYOFYEAR('1998-02-03');
-> 34
EXTRACT(type FROM date)
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.00123");
-> 123
FROM_DAYS(N)
指定された日数 N
に対して
DATE
型の値を返す。
mysql> SELECT FROM_DAYS(729669);
-> '1997-10-07'
FROM_DAYS()
では、グレゴリオ暦(1582
年)より前の値の指定は想定していない。これは、カレンダが変更されたときに失われた日数が考慮されないためである。
FROM_UNIXTIME(unix_timestamp)
,
FROM_UNIXTIME(unix_timestamp,format)
文字列と数値のどちらのコンテキストで使用されているかに応じて、unix_timestamp
の値を 'YYYY-MM-DD HH:MM:SS'
または
YYYYMMDDHHMMSS
形式で返す。
mysql>SELECT FROM_UNIXTIME(875996580);
-> '1997-10-04 22:23:00' mysql>SELECT FROM_UNIXTIME(875996580) + 0;
-> 19971004222300
format
を指定した場合、結果は
format
文字列に基づいて形式設定される。format
には、DATE_FORMAT()
関数の入力値と同じ指定子を組み込める。
mysql>SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),
->'%Y %D %M %h:%i:%s %x');
-> '2003 6th August 06:22:58 2003'
GET_FORMAT(DATE | TIME | TIMESTAMP, 'EUR' | 'USA' |
'JIS' | 'ISO' | 'INTERNAL')
フォーマットの文字列を返す。この関数は、DATE_FORMAT()
関数や STR_TO_DATE()
関数と組み合わせて使用したり、サーバ変数
DATE_FORMAT
、TIME_FORMAT
、DATETIME_FORMAT
を設定したりするときに役立つ。最初の引数には
3 つの入力可能値があり、2 番目の引数には 5
つの入力可能値があるため、結果として返されるフォーマット文字列は全部で
15
通りある(使用される指定子については、DATE_FORMAT()
関数の説明に含まれている表を参照)。
関数呼び出し | 結果 |
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(TIMESTAMP,'USA') |
'%Y-%m-%d-%H.%i.%s' |
GET_FORMAT(TIMESTAMP,'JIS') |
'%Y-%m-%d %H:%i:%s' |
GET_FORMAT(TIMESTAMP,'ISO') |
'%Y-%m-%d %H:%i:%s' |
GET_FORMAT(TIMESTAMP,'EUR') |
'%Y-%m-%d-%H.%i.%s' |
GET_FORMAT(TIMESTAMP,'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' |
ISO 形式は ISO 8601 ではなく、ISO 9075。
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 mysql>SET DATE_FORMAT=GET_FORMAT(DATE, 'USA'); SELECT '2003-10-31';
-> 10-31-2003
GET_FORMAT()
は MySQL 4.1.1
以降で使用できる。 See 項5.5.6. 「SET
構文」
を参照。
HOUR(time)
time
に指定された時刻の時間部分の値を返す。戻り値の範囲は、1
日の時間を示す値の場合は 0
から 23
。
mysql> SELECT HOUR('10:05:03');
-> 10
しかし、TIME
値の範囲は、実際にはこれよりずっと広いため、23
より大きい値が HOUR
として返ることがある。
mysql> SELECT HOUR('272:59:59');
-> 272
LAST_DAY(date)
指定された日付または日付時刻の値に対し、その値が含まれる月の最後の日にちを返す。引数が無効な場合は、NULL
を返す。
mysql>SELECT LAST_DAY('2003-02-05'), LAST_DAY('2004-02-05');
-> '2003-02-28', '2004-02-29' mysql>SELECT LAST_DAY('2004-01-01 01:01:01');
-> '2004-01-31' mysql>SELECT LAST_DAY('2003-03-32');
-> NULL
LAST_DAY()
は MySQL 4.1.1
以降で使用できる。
LOCALTIME
,
LOCALTIME()
LOCALTIME
と
LOCALTIME()
は NOW()
のシノニム。
LOCALTIMESTAMP
,
LOCALTIMESTAMP()
LOCALTIMESTAMP
と
LOCALTIMESTAMP()
は
NOW()
のシノニム。
MAKEDATE(year,dayofyear)
指定された年の値と年間を通した日にちの値に対応する日付を返す。
dayofyear
には、0
より大きい値を指定する必要がある。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
MAKEDATE()
は MySQL 4.1.1
以降で使用できる。
MAKETIME(hour,minute,second)
引数
hour
、minute
、second
に指定された値から計算した時刻値を返す。
mysql> SELECT MAKETIME(12,15,30);
-> '12:15:30'
MAKETIME()
は MySQL 4.1.1
以降で使用できる。
MICROSECOND(expr)
時刻式または日付時刻式 expr
からマイクロ秒を、0
〜
999999
の範囲内の数値として返す。
mysql>SELECT MICROSECOND('12:00:00.123456');
-> 123456 mysql>SELECT MICROSECOND('1997-12-31 23:59:59.000010');
-> 10
MICROSECOND()
は MySQL 4.1.1
以降で使用できる。
MINUTE(time)
time
に指定された時刻の分を、0
〜
59
の範囲の値として返す。
mysql> SELECT MINUTE('98-02-03 10:05:03');
-> 5
MONTH(date)
date
に指定された日付の月を、1
〜
12
の範囲の値として返す。
mysql> SELECT MONTH('1998-02-03');
-> 2
MONTHNAME(date)
date
に指定された月の名前を返す。
mysql> SELECT MONTHNAME('1998-02-05');
-> 'February'
NOW()
文字列と数値のどちらのコンテキストで使用されているかに応じて、'YYYY-MM-DD
HH:MM:SS'
または
YYYYMMDDHHMMSS
形式の値として、現在の日付と時刻を返す。
mysql>SELECT NOW();
-> '1997-12-15 23:50:26' mysql>SELECT NOW() + 0;
-> 19971215235026
PERIOD_ADD(P,N)
N
に指定された月数を期間
P
(YYMM
または
YYYYMM
の形式)に加える。戻り値は
YYYYMM
の形式で返る。
注意: 期間引数 P
には、日付値を指定しないようにする。
mysql> SELECT PERIOD_ADD(9801,2);
-> 199803
PERIOD_DIFF(P1,P2)
期間 P1
と P2
の間の月数を返す。 P1
と
P2
の指定は YYMM
または YYYYMM
形式で行う。
注意: 期間引数 P1
と
P2
には、日付値を指定しないようにする。
mysql> SELECT PERIOD_DIFF(9802,199703);
-> 11
QUARTER(date)
date
に指定された日付に対応する四半期を、1
〜 4
の範囲の値として返す。
mysql> SELECT QUARTER('98-04-01');
-> 2
SECOND(time)
time
に指定された時刻の秒を、0
〜
59
の範囲の値として返す。
mysql> SELECT SECOND('10:05:03');
-> 3
SEC_TO_TIME(seconds)
seconds
引数に指定された秒数を時、分、秒の値に変換し、文字列と数値のどちらのコンテキストで使用されているかに応じて、'HH:MM:SS'
または HHMMSS
形式の値として返す。
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
を取り、DATETIME
型の値を返す。
str
に指定した日付、時刻、または日付時刻の値が、format
に指定した形式で返される。format
に使用できる指定子については、DATE_FORMAT()
関数の説明にある表を参照。他の文字はいずれも、解釈されずに文字どおり受け取られる。
str
に誤った日付、時刻、または日付時刻が含まれている場合、STR_TO_DATE()
は NULL
を返す。
mysql>SELECT STR_TO_DATE('03.10.2003 09.20', '%d.%m.%Y %H.%i')
-> 2003-10-03 09:20:00 mysql>SELECT STR_TO_DATE('10rap', '%crap')
-> 0000-10-00 00:00:00 mysql>SELECT STR_TO_DATE('2003-15-10 00:00:00', '%Y-%m-%d %H:%i:%s')
-> NULL
STR_TO_DATE()
は MySQL 4.1.1
以降で使用できる。
SUBDATE(date,INTERVAL expr type)
,
SUBDATE(expr,days)
2 番目の引数の INTERVAL
を指定する形式で呼び出した場合、SUBDATE()
は DATE_SUB()
とシノニムになる。
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 番目の構文は MySQL 4.1.1
以降で使用できる。expr
には日付式か日付時刻式を指定し、days
には expr
から差し引く日数を指定する。
mysql> SELECT SUBDATE('1998-01-02 12:00:00', 31);
-> '1997-12-02 12:00:00'
SUBTIME(expr,expr2)
SUBTIME()
では、expr
から
expr2
を差し引いた結果が返される。
expr
には日付式か日付時刻式を指定し、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'
SUBTIME()
は MySQL 4.1.1
で追加された。
SYSDATE()
SYSDATE()
は NOW()
のシノニム。
TIME(expr)
時刻式または日付時刻式 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'
TIME()
は MySQL 4.1.1
以降で使用できる。
TIMEDIFF(expr,expr2)
TIMEDIFF()
では、開始時刻
expr
と終了時刻
expr2
の間の時間が返される。
expr
と 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'
TIMEDIFF()
は MySQL 4.1.1
で追加された。
TIMESTAMP(expr)
,
TIMESTAMP(expr,expr2)
引数が 1
つの場合は、日付式または日付時刻式
expr
を日付時刻値として返す。
引数が 2
つの場合は、日付式または日付時刻式
expr
に時刻式
expr2
を加えた結果を日付時刻値として返す。
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'
TIMESTAMP()
は MySQL 4.1.1
以降で使用できる。
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('1997-10-07');
-> 729669
TO_DAYS()
では、グレゴリオ暦(1582
年)より前の値の指定は想定していない。これは、カレンダが変更されたときに失われた日数が考慮されないため。
UNIX_TIMESTAMP()
,
UNIX_TIMESTAMP(date)
引数なしで呼び出された場合、Unix
タイムスタンプ('1970-01-01
00:00:00'
GMT
からの秒数)を符号なしの整数として返す。date
引数を指定して呼び出された場合、UNIX_TIMESTAMP()
は引数に指定された日付を '1970-01-01
00:00:00'
GMT
からの秒数として返す。引数
date
には、DATE
型文字列、DATETIME
型文字列、TIMESTAMP
型の値、YYMMDD
または
YYYYMMDD
の形式の現地時間のいずれかを指定できる。
mysql>SELECT UNIX_TIMESTAMP();
-> 882226357 mysql>SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
-> 875996580
UNIX_TIMESTAMP
を
TIMESTAMP
型のカラムに使用すると。``文字列から Unix
タイムスタンプへの''
暗黙的な変換を行わずに、内部のタイムスタンプ値が直接返される。
UNIX_TIMESTAMP()
に範囲外の日付を渡すと、0
が返されるが、この場合、実行されるチェックは基本チェック(年
1970 〜 2037、月 01 〜 12、日 01 〜
31)に限られる。
UNIX_TIMESTAMP()
カラム値を差し引く場合、結果を符号付き整数にキャストする必要がある場合がある。
See 項6.3.5. 「キャスト関数」。
UTC_DATE
, UTC_DATE()
文字列と数値のどちらのコンテキストで使用されているかに応じて、'YYYY-MM-DD'
または
YYYYMMDD
形式の値として、現在の
UTC 日付を返す。
mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
-> '2003-08-14', 20030814
UTC_DATE()
は MySQL 4.1.1
以降で使用できる。
UTC_TIME
, UTC_TIME()
文字列と数値のどちらのコンテキストで使用されているかに応じて、'HH:MM:SS'
または HHMMSS
形式の値として、現在の UTC 時刻を返す。
mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
-> '18:07:53', 180753
UTC_TIME()
は MySQL 4.1.1
以降で使用できる。
UTC_TIMESTAMP
,
UTC_TIMESTAMP()
文字列と数値のどちらのコンテキストで使用されているかに応じて、'YYYY-MM-DD
HH:MM:SS'
または
YYYYMMDDHHMMSS
形式の値として、現在の UTC
の日付と時刻を返す。
mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
-> '2003-08-14 18:08:04', 20030814180804
UTC_TIMESTAMP()
は MySQL 4.1.1
以降で使用できる。
WEEK(date [,mode])
date
に指定された日付に対応する週数を返す。
引数を 2 つ取る形式の WEEK()
では、週を日曜と月曜のどちらから開始するかと、戻り値の範囲を
0 〜 53 と 1 〜 52
のどちらにするかを指定できる。mode
引数を省略した場合は、default_week_format
サーバ変数の値(または MySQL 4.0
以前のバージョンでは 0)が適用される。 See
項5.5.6. 「SET
構文」。
次の表に、mode
引数の動作を示す。
値 | 意味 |
0 | 日曜から週を開始。戻り値の範囲は 0 〜 53。週 1 はその年に開始される最初の週。 |
1 | 月曜から週を開始。戻り値の範囲は 0 〜 53。週 1 は 4 日以上の日を持つその年の最初の週。 |
2 | 日曜から週を開始。戻り値の範囲は 1 〜 53。週 1 はその年に開始される最初の週。 |
3 | 月曜から週を開始。戻り値の範囲は 1 〜 53。週 1 は 4 日以上の日を持つその年の最初の週。 |
4 | 日曜から週を開始。戻り値の範囲は 0 〜 53。週 1 は 4 日以上の日を持つその年の最初の週。 |
5 | 月曜から週を開始。戻り値の範囲は 0 〜 53。週 1 はその年に開始される最初の週。 |
6 | 日曜から週を開始。戻り値の範囲は 1 〜 53。週 1 は 4 日以上の日を持つその年の最初の週。 |
7 | 月曜から週を開始。戻り値の範囲は 1 〜 53。週 1 はその年に開始される最初の週。 |
mode
値 3 は MySQL 4.0.5
以降で使用できる。 mode
値 4
以上は MySQL 4.0.17 以降で使用できる。
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
注意:バージョン 4.0
で、WEEK(date,0)
は米国のカレンダに合わせて変更された。それ以前のバージョンでは、WEEK()
の計算は米国の日付に対して正しく行われなかった(事実上、すべての場合で、WEEK(date)
と WEEK(date,0)
で結果が誤っていた)。
注意:
指定された日付が前年の最後の週にあたる場合、オプションの
mode
引数として 2、3、6、7
のいずれかが指定されていないと、MySQL
から値 0 が返る。
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
-> 2000, 0
この場合、指定された日付は実際には 1999
年の 52
週目に含まれるため、WEEK()
関数の結果として値 52
を返すべきだとする考え方もあるが、MySQL
ではそのようにはせず、値 0
を返すようにした。これは、この関数によって、あくまでも
``指定された年の週数''
が返されるようにするためである。そうすることで、日付から日付部分を取り出す他の関数と組み合わせて
WEEK()
関数を使用した場合の信頼性が確保される。
結果の評価を、指定した日付の週の最初の日が含まれる年に関連して行うには、オプションの
mode
引数として 2、3、6、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
= 月曜、1
= 火曜、...
6
= 日曜)を返す。
mysql>SELECT WEEKDAY('1998-02-03 22:23:00');
-> 1 mysql>SELECT WEEKDAY('1997-11-05');
-> 2
WEEKOFYEAR(date)
指定された日付のカレンダ上の週を、1
〜 53
の数値として返す。
mysql> SELECT WEEKOFYEAR('1998-02-20');
-> 8
WEEKOFYEAR()
は MySQL 4.1.1
以降で使用できる。
YEAR(date)
date
に指定された日付の年を、1000
〜 9999
の数値として返す。
mysql> SELECT YEAR('98-02-03');
-> 1998
YEARWEEK(date)
,
YEARWEEK(date,start)
指定された日付の年と週を返す。start
引数は、WEEK()
に対する
start
引数とまったく同じように作用する。注意:
date
引数に指定された日付の週がその年の最初の週である場合と最後の週である場合、結果の年が
date 引数の年と異なることがある。
mysql> SELECT YEARWEEK('1987-01-01');
-> 198653
結果の週数は、オプション引数
0
または 1
を指定した WEEK()
関数で返る値と異なる。WEEK()
関数では、指定した年のコンテキストで週数が返される。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.