MySQL 5.1 リファレンスマニュアル :: 11 関数と演算子 :: 11.5 日付時刻関数
« 11.4.2 数学関数

11.6 MySQL が使用するカレンダーは ? »
Section Navigation      [Toggle]
  • 11 関数と演算子
  • 11.1 演算子
  • 11.2 制御フロー関数
  • 11.3 文字列関数
  • 11.4 数字関数
  • 11.5 日付時刻関数
  • 11.6 MySQL が使用するカレンダーは ?
  • 11.7 全文検索関数
  • 11.8 キャスト関数と演算子
  • 11.9 XML 関数
  • 11.10 その他の関数
  • 11.11 GROUP BY 句との関数および修飾子の使用

11.5. 日付時刻関数

このセクションでは、時間値の処理に使用できる関数について説明します。各日付日時タイプが持つ値の範囲の説明と、値が指定されている場合の有効なフォーマットの説明は 項10.3. 「日付と時刻タイプ」 をご覧ください。

日付関数の使用例です。次のクエリはすべての行を、過去 30 日以内の date_col で選択します :

mysql> SELECT something FROM tbl_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(expr1,expr2)

    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)

    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 テーブルもロックする必要があります。

  • 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'
    
  • DATEDIFF(expr1,expr2)

    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 + INTERVAL expr unit
    date - INTERVAL expr 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(date,format)

    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 、上記にないすべての ‘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(date)

    DAY() は DAYOFMONTH( のシノニムです。

  • DAYNAME(date)

    date に対して曜日の名前を戻します。MySQL 5.1.12 からは、名前に使用される言語は、lc_time_names システム環境変数 ( 項4.10.9. 「MySQL サーバのローケル サポート」 ) の値によって管理されます。

    mysql> SELECT DAYNAME('1998-02-05');
            -> 'Thursday'
    
  • DAYOFMONTH(date)

    0 から 31 の範囲内の日にちを、date に対して戻します。

    mysql> SELECT DAYOFMONTH('1998-02-03');
            -> 3
    
  • DAYOFWEEK(date)

    date ( 1 = Sunday 、2 = Monday 、… 、7 = Saturday ) に対する曜日のインデックスを戻します。これらのインデックス値は、ODBC 標準に対応しています。

    mysql> SELECT DAYOFWEEK('1998-02-03');
            -> 3
    
  • DAYOFYEAR(date)

    1 から 366 の範囲内の通日を、date に対して戻します。

    mysql> SELECT DAYOFYEAR('1998-02-03');
            -> 34
    
  • EXTRACT(unit 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.000123');
            -> 123
    
  • FROM_DAYS(N)

    日数 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'
    
  • HOUR(time)

    time の正時 ( hour ) を戻します。戻り値の範囲は、時刻値の 0 から 23 です。ただし、TIME 値の範囲は実際にはもっと大きいため、HOUR は 23 以上の値を戻すことができます。

    mysql> SELECT HOUR('10:05:03');
            -> 10
    mysql> SELECT HOUR('272:59:59');
            -> 272
    
  • LAST_DAY(date)

    日付または日付時刻を取り、月の最後の日の換算値を戻します。引数が無効である場合は NULL を戻します。

    mysql> SELECT LAST_DAY('2003-02-05');
            -> '2003-02-28'
    mysql> SELECT LAST_DAY('2004-02-05');
            -> '2004-02-29'
    mysql> SELECT LAST_DAY('2004-01-01 01:01:01');
            -> '2004-01-31'
    mysql> SELECT LAST_DAY('2003-03-32');
            -> NULL
    
  • LOCALTIME, LOCALTIME()

    LOCALTIME および LOCALTIME() は NOW() のシノニムです。

  • LOCALTIMESTAMP, LOCALTIMESTAMP()

    LOCALTIMESTAMP および LOCALTIMESTAMP() は NOW() のシノニムです。

  • MAKEDATE(year,dayofyear)

    日付、提示された年、そして通日の値を戻します。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
    
  • MAKETIME(hour,minute,second)

    hour 、minute 、および second 引数から計算された時間値を戻します。

    mysql> SELECT MAKETIME(12,15,30);
            -> '12:15:30'
    
  • MICROSECOND(expr)

    時間または日付時刻式 expr からのマイクロ秒を、0 から 999999 までの範囲の数値として戻します。

    mysql> SELECT MICROSECOND('12:00:00.123456');
            -> 123456
    mysql> SELECT MICROSECOND('1997-12-31 23:59:59.000010');
            -> 10
    
  • MINUTE(time)

    0 から 59 の範囲内で、time の分数を戻します。

    mysql> SELECT MINUTE('98-02-03 10:05:03');
            -> 5
    
  • MONTH(date)

    0 から 12 の範囲内で、date の月を戻します。

    mysql> SELECT MONTH('1998-02-03');
            -> 2
    
  • MONTHNAME(date)

    date の月の完全名を戻します。MySQL 5.1.12 からは、名前に使用される言語は、lc_time_names システム環境変数 ( 項4.10.9. 「MySQL サーバのローケル サポート」 ) の値によって管理されます。

    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
    

    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() の説明をご覧ください。

  • 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)

    0 から 59 の範囲内で、time の秒数を戻します。

    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 を受取ります。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,expr2)

    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'
    
  • SYSDATE()

    関数がストリングで使用されているか、もしくは数値コンテキストで使用されているかによって、現在の日付を '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() のエイリアスになるようにしてください。

  • 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'
    
  • TIMEDIFF(expr1,expr2)

    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
    
  • 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 ) の出現を優先される値と使用する目的はありません。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_DATE, UTC_DATE()

    関数がストリングで使用されているか、もしくは数値コンテキストで使用されているかによって、現在の UTC 日付を 'YYYY-MM-DD' または YYYYMMDD フォーマットの値で戻します。

    mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
            -> '2003-08-14', 20030814
    
  • UTC_TIME, UTC_TIME()

    関数がストリングで使用されているか、もしくは数値コンテキストで使用されているかによって、現在の 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
    
  • WEEK(date[,mode])

    この関数は 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'
    
  • WEEKDAY(date)

    date ( 0 = Monday 、1 = Tuesday 、… 、… 6 = Sunday ) の曜日のインデックスを戻します。

    mysql> SELECT WEEKDAY('1998-02-03 22:23:00');
            -> 1
    mysql> SELECT WEEKDAY('1997-11-05');
            -> 2
    
  • WEEKOFYEAR(date)

    1 から 53 の範囲で、日付の暦週を返します。WEEKOFYEAR() は WEEK(date,3) に等価な互換性の関数です。

    mysql> SELECT WEEKOFYEAR('1998-02-20');
            -> 8
    
  • YEAR(date)

    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 ) よって異なります。

Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates