MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  関数と演算子  /  日付および時間関数

12.7 日付および時間関数

このセクションでは、時間値の処理に使用できる関数について説明します。 各日付日時型が持つ値の範囲、および値を指定する際の有効な書式については、セクション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()

TIMEDATETIME および TIMESTAMP 値の小数秒は、マイクロ秒までの精度でサポートされます。 時間引数を取る関数は、小数秒を含む値を受け入れます。 時間関数からの戻り値には、必要に応じて小数秒が含まれます。

  • ADDDATE(date,INTERVAL expr 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()expr2expr1 を加算し、その結果を返します。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() は、日付時間値 dtfrom_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() は、ある日付から別の日付までの日数の値として表現された expr1expr2 を返します。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,INTERVAL expr unit), DATE_SUB(date,INTERVAL expr unit)

    これらの関数は日付演算を実行します。 date 引数は、開始日または日時の値を指定します。expr は、開始日に対して加算または減算される間隔値を指定する式です。expr は文字列として評価されます。負の間隔では - で始まる場合があります。unit は、式を解釈する単位を示すキーワードです。

    unit 指定子の完全なリスト、各 unit 値に必要な expr 引数の形式、および時間演算でのオペランド解釈の規則など、時間間隔構文の詳細は、時間間隔 を参照してください。

    戻り値は引数によって異なります。

    • date 引数が DATE 値で、計算に YEARMONTH および DAY 部分のみが含まれる (つまり、時間部分が含まれない) 場合は、DATE

    • 第 1 引数が DATETIME (または TIMESTAMP) 値である場合と、第 1 引数が DATE で、unit 値に HOURSMINUTES、または 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:ssAM または PM が続く)
    %S 秒数 (0059)
    %s 秒数 (0059)
    %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,INTERVAL expr 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 FROM date)

    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 値の範囲は実際にはもっと大きいため、HOUR23 よりも大きい値を返すことができます。

    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)

    hourminute、および 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)

    期間 P1P2 間の月数を返します。 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,INTERVAL expr 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 と同じ書式で表現される expr1expr2 を返します。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_formatSTATEMENT に設定されているときに、この関数を使用すると、警告のログが記録されます。

    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() は、時間値として表現された expr1expr2 を返します。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 (マイクロ秒)、SECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAR 値のいずれかにする必要があります。

    unit 値を指定するには、ここで示したキーワードのいずれかを使用するか、SQL_TSI_ をプリフィクスとして付けます。 たとえば、DAYSQL_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_expr2datetime_expr1 を返します。datetime_expr1datetime_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 引数には、DATEDATETIME または 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 引数として236、または 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 引数として 025、または 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) とは異なります。


関連キーワード:  関数, 日付, expr, TIMESTAMP, date, FORMAT, 部分, 範囲, DAY, WEEK