MySQL関数:日付、時刻


前言
英語
日付date時刻time日付時刻datetimeタイムスタンプtimestamp
グリニッジ時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)から現在までの総秒数.Unixタイムスタンプ:1218206831(検証:select unix_timestamp(‘2008-08-08 22:47:11’);MySQLタイムスタンプ:2008-08-08 22:47:11
タイムゾーンタイムゾーン
取得日時
現在の日付
select curdate(), current_date(), current_date; // 2018-06-21

現在の時刻
select curtime(), current_time(), current_time; // 15:13:17

現在の日付+時刻
select now(), sysdate(), localtime, localtime(), localtimestamp, localtimestamp(); // 2018-06-21 15:13:17
select current_timestamp, current_timestamp(); // MySQL      now()     
  • now()は、実行開始時に値が得られる.now()効果と同じ関数:localtime、localtime()、localtimestamp、localtimestamp()です.別のMySQLタイムスタンプ関数:current_timestamp、current_timestamp()とnow()のフォーマットは同じです.now()関数は簡単で覚えやすいので、他の関数の代わりにnow()を常に使用することをお勧めします.
  • sysdate()関数実行時に動的に値を得る(一般的には少ない).テストは下記
  • select now(), sysdate(), current_timestamp, current_timestamp(), localtime, localtime(), localtimestamp, localtimestamp(),
    sleep(2), 
    now(), sysdate(), current_timestamp, current_timestamp(), localtime, localtime(), localtimestamp, localtimestamp();

    現在のUTC日付時刻
    わが国は東八時区にあるので、ローカル時間=UTC時間+8時間です.UTC時間は、業務が複数の国や地域に及ぶ場合に便利です.
    select utc_timestamp(), utc_date(), utc_time(), now();
    // | 2008-08-08 14:47:11 | 2008-08-08 | 14:47:11   | 2008-08-08 22:47:11 | 

    MySQLパッチワーク日付、時間関数:makedate(year,dayofyear)、maketime(hour,minute,second)
    select makedate(2001,31);   -- '2001-01-31' 
    select makedate(2001,32);   -- '2001-02-01'
    
    select maketime(12,15,30); -- '12:15:30'

    へんかんかんすう
    日付、時刻、文字列の相互転送
    date_format(date,format)は、1つの日付を様々な文字列フォーマットtime_に変換することができる.format(time,format)は、1つの時間を様々な文字列フォーマットstr_に変換することができる.to_date(str, format) date_format、time_formatの逆変換
    日付が変わる
    to_days(date) from_days(days)
    時間が秒を回す
    time_to_sec(time) sec_to_time(seconds)
    Unixタイムスタンプと日付の相互転送
    unix_timestamp()
    unix_timestamp(date)
    from_unixtime(unix_timestamp)
    from_unixtime(unix_timestamp, format)
    select unix_timestamp(); -- 1529502063
    select unix_timestamp('2018-06-20'); -- 1529424000
    select unix_timestamp('2018-06-20 21:43:20'); -- 1529502200
    
    select from_unixtime(1529502063); -- '2018-06-20 21:41:03'
    select from_unixtime(1529424000); -- '2018-06-20 00:00:00'
    select from_unixtime(1529502200); -- '2018-06-20 21:43:20'
    select from_unixtime(1529502200, '%Y-%m-%d %H:%i:%s'); -- '2018-06-20 21:43:20'

    MySQLタイムスタンプ変換、増減関数
    timestamp(date)                                     -- date to timestamp 
    timestamp(date, time)                                  -- date + time 
    timestampadd(unit, interval, datetime_expr)           -- 
    timestampdiff(unit, datetime_expr1, datetime_expr2)   --

    unit:microsecond、second、minute、hour、day、week、month、quarter、year
    select timestamp('2008-08-08');                         -- 2008-08-08 00:00:00 
    select timestamp('2008-08-08 08:00:00', '01:01:01');    -- 2008-08-08 09:01:01 
    select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01
    
    -- MySQL timestampadd()       date_add()
    select timestampadd(day, 1, '2008-08-08 08:00:00');     -- 2008-08-09 08:00:00 
    select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00
    -- MySQL timestampdiff()      datediff()      ,datediff()         (date)       
    select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1
    select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485
    select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12
    select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7

    元の日付、時刻の減算:
    select (UNIX_TIMESTAMP(atime) - UNIX_TIMESTAMP(btime)) sec from A; --      
    select (TIME_TO_SEC(atime) - TIME_TO_SEC(btime)) sec from A; --     
    
    --   ,           
    select (atime - btime) sec from A;

    MySQL日付増減関数:date_add()、date_sub()
    set @dt = now();
    
    -- date_add()
    select date_add(@dt, interval 1 day); --  1 
    select date_add(@dt, interval 1 hour); --  1  
    select date_add(@dt, interval 1 minute); -- ...
    select date_add(@dt, interval 1 second);
    select date_add(@dt, interval 1 microsecond);
    select date_add(@dt, interval 1 week);
    select date_add(@dt, interval 1 month);
    select date_add(@dt, interval 1 quarter);
    select date_add(@dt, interval 1 year);
    select date_add(@dt, interval -1 day); --  1 
    select date_add(@dt, interval '01:15:30' hour_second); --  1  15 30 
    select date_add(@dt, interval '1 01:15:30' day_second); --  1  1  15 30 
    
    -- date_sub()
    select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second); --  1 1  1  1 

    MySQL時間増減関数:datediff(date 1,date 2)、timediff(time 1,time 2)
    -- datediff(date1, date2):       date1 - date2,    
    select datediff('2008-08-08', '2008-08-01'); -- 7
    select datediff('2008-08-01', '2008-08-08'); -- -7
    
    -- timediff(time1, time2):       time1 - time2,   time   
    select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
    select timediff('08:08:08', '00:00:00'); -- 08:08:08

    注意:timediff(time 1,time 2)関数の2つのパラメータタイプは同じでなければなりません.
    タイムゾーン変換関数
    convert_tz(dt,from_tz,to_tz)
    
    select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

    タイムゾーン変換はdate_でも可能ですadd, date_sub,timestampaddが実現する.
    select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00
    select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00
    select timestampadd(hour, -8, '2008-08-08 12:00:00'); -- 2008-08-08 04:00:00

    MySQL取得国地域時間フォーマット関数:get_format()
    MySQL get_format()関数は実際に使用する機会が少ない.
    get_format(date|time|datetime, 'eur'|'usa'|'jis'|'iso'|'internal'
    
    -- MySQL get_format()        
    select get_format(date,'usa')          ;   -- '%m.%d.%Y' 
    select get_format(date,'jis')          ;   -- '%Y-%m-%d' 
    select get_format(date,'iso')          ;   -- '%Y-%m-%d' 
    select get_format(date,'eur')          ;   -- '%d.%m.%Y' 
    select get_format(date,'internal')     ;   -- '%Y%m%d' 
    select get_format(datetime,'usa')      ;   -- '%Y-%m-%d %H.%i.%s' 
    select get_format(datetime,'jis')      ;   -- '%Y-%m-%d %H:%i:%s' 
    select get_format(datetime,'iso')      ;   -- '%Y-%m-%d %H:%i:%s' 
    select get_format(datetime,'eur')      ;   -- '%Y-%m-%d %H.%i.%s' 
    select get_format(datetime,'internal') ;   -- '%Y%m%d%H%i%s' 
    select get_format(time,'usa')          ;   -- '%h:%i:%s %p' 
    select get_format(time,'jis')          ;   -- '%H:%i:%s' 
    select get_format(time,'iso')          ;   -- '%H:%i:%s' 
    select get_format(time,'eur')          ;   -- '%H.%i.%s' 
    select get_format(time,'internal')     ;   -- '%H%i%s'

    MySQL日時Extract(選択)関数
    日付、時刻、年、四半期、月、日、時間、分、秒、マイクロ秒の各セクションを選択します.
    set @dt = '2008-09-10 07:15:30.123456';
    
    select date(@dt);        -- 2008-09-10 
    select time(@dt);        -- 07:15:30.123456 
    select year(@dt);        -- 2008 
    select quarter(@dt);     -- 3 
    select month(@dt);       -- 9 
    select week(@dt);        -- 36 
    select day(@dt);         -- 10 
    select hour(@dt);        -- 7 
    select minute(@dt);      -- 15 
    select second(@dt);      -- 30 
    select microsecond(@dt); -- 123456

    Extract()関数、類似の機能を実現
    set @dt = '2008-09-10 07:15:30.123456';
    
    select extract(year                from @dt); -- 2008 
    select extract(quarter             from @dt); -- 3 
    select extract(month               from @dt); -- 9 
    select extract(week                from @dt); -- 36 
    select extract(day                 from @dt); -- 10 
    select extract(hour                from @dt); -- 7 
    select extract(minute              from @dt); -- 15 
    select extract(second              from @dt); -- 30 
    select extract(microsecond         from @dt); -- 123456
    
    select extract(year_month          from @dt); -- 200809 
    select extract(day_hour            from @dt); -- 1007 
    select extract(day_minute          from @dt); -- 100715 
    select extract(day_second          from @dt); -- 10071530 
    select extract(day_microsecond     from @dt); -- 10071530123456 
    select extract(hour_minute         from @dt); --    715 
    select extract(hour_second         from @dt); --    71530 
    select extract(hour_microsecond    from @dt); --    71530123456 
    select extract(minute_second       from @dt); --      1530 
    select extract(minute_microsecond from @dt); --      1530123456 
    select extract(second_microsecond from @dt); --        30123456

    MySQL Extract()関数は、date()、time()の機能がない場合を除き、その他の機能はすべて揃っています.「day_」も選択されていますMicrosecondなどの機能.注意ここではdayとmicrosecondのみを選択するのではなく、日付のday部分からmicrosecond部分まで選択します.MySQL Extract()関数の唯一の悪い点は、キーボードを何度も叩く必要があることです.
    MySQL dayof...関数:dayofweek()、dayofmonth()、dayofyear()
    1週間、1月、1年の日付パラメータをそれぞれ返します.
    set @dt = '2008-08-08';
    
    select dayofweek(@dt);   -- 6 
    select dayofmonth(@dt); -- 8 
    select dayofyear(@dt);   -- 221

    日付‘2008-08-08’は、1週間で6日目(1=サンデー、2=Monday、...、7=Saturday);1月の8日目.一年の221日目.
    MySQL week...関数:week()、weekofyear()、dayofweek()、weekday()、yearweek()
    set @dt = '2008-08-08';
    
    select week(@dt);        -- 31 
    select week(@dt,3);      -- 32 
    select weekofyear(@dt); -- 32
    
    select dayofweek(@dt);   -- 6 
    select weekday(@dt);     -- 4
    
    select yearweek(@dt);    -- 200831

    MySQL week()関数は、2つのパラメータがあります.具体的にはマニュアルを参照してください.weekofyear()はweek()と同様に、「ある日」が1年の何週目にあるかを計算します.weekofyear(@dt)はweek(@dt,3)に等価である.
    MySQL weekday()関数は、dayofweek()と同様に、1週間の「ある日」の位置を返します.違いは参考の基準でweekday:(0=Monday,1=Tuesday,...,6=Sunday);dayofweek:(1 = Sunday, 2 = Monday, …, 7 = Saturday)
    MySQL yearweek()関数は、year(2008)+week位置(31)を返します.
    MySQLは、曜日と月の名前関数を返します:dayname()、monthname()
    set @dt = '2008-08-08';
    
    select dayname(@dt);     -- Friday 
    select monthname(@dt);   -- August

    MySQL last_day()関数:月の最終日を返します
    select last_day('2008-02-01'); -- 2008-02-29 
    select last_day('2008-08-08'); -- 2008-08-31

    MySQL last_day()関数はとても役に立ちます.例えば、現在の月に何日あるかを手に入れたいです.
    select now(), day(last_day(now())) as days;