Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

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> SELECTsomething FROMtbl_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);        -> NULLmysql> 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,INTERVALexprunit),ADDDATE(expr,days)

    INTERVAL 形式の 2 番目の引数を付けて呼び出されると、ADDDATE()DATE_ADD() のシノニムになります。 関連する関数SUBDATE()DATE_SUB() のシノニムです。INTERVALunit 引数の詳細は、時間間隔 を参照してください。

    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');        -> 1mysql> SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31');        -> -31
  • DATE_ADD(date,INTERVALexprunit),DATE_SUB(date,INTERVALexprunit)

    これらの関数は日付演算を実行します。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)
    %pAM または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 桁)
    %%リテラル% 文字
    %xx (上記にないすべての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,INTERVALexprunit)

    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');        -> 2019mysql> SELECT EXTRACT(YEAR_MONTH FROM '2019-07-02 01:02:03');        -> 201907mysql> SELECT EXTRACT(DAY_MINUTE FROM '2019-07-02 01:02:03');        -> 20102mysql> 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;        -> 20151113100801mysql> 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');        -> 10mysql> 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');        -> 123456mysql> 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');        -> NULLmysql> 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: 1411Message: 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,INTERVALexprunit),SUBDATE(expr,days)

    INTERVAL 形式で 2 番目の引数を付けて呼び出されると、SUBDATE()DATE_SUB() のシノニムになります。INTERVALunit 引数については、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');        -> 3mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');        -> -1mysql> 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');        -> 80580mysql> SELECT TIME_TO_SEC('00:39:38');        -> 2378
  • TO_DAYS(date)

    日付date が指定され、日数 (0 年以降の日数) を返します。

    mysql> SELECT TO_DAYS(950501);        -> 728779mysql> 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);        -> 62966505600mysql> SELECT TO_SECONDS('2009-11-29');        -> 63426672000mysql> SELECT TO_SECONDS('2009-11-29 13:43:32');        -> 63426721412mysql> 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();        -> 1447431666mysql> SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19');        -> 1447431619mysql> 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');        -> 7mysql> SELECT WEEK('2008-02-20',0);        -> 7mysql> SELECT WEEK('2008-02-20',1);        -> 8mysql> 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');        -> 199952mysql> 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');        -> 6mysql> 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) とは異なります。