1. 程式人生 > >mysql 日期轉換,時間轉換,時間段查詢

mysql 日期轉換,時間轉換,時間段查詢

一. 時區轉換

  1. 轉換資料庫中已存時間的時區
CONVERT_TZ(dt ,from_tz ,to_tz )
eg 
SELECT now(), CONVERT_TZ (now(), '+8:00', '-8:00')  as los;

時區轉換也可以通過 date_add, date_sub, timestampadd 來實現

  1. 獲得國家地區時間格式
get_format(date|time|datetime, 'eur'|'usa'|'jis'|'iso'|'internal'
eg
select get_format(date,'usa');       -- %m
.%d.%Y select get_format(time,'usa'); -- %h:%i:%s %p select get_format(datetime,'usa'); -- %Y-%m-%d %H.%i.%s

函式使用說明: CONVERT_TZ() 將時間日期值 dt 從 from_tz 給出的時區轉到 to_tz 給出的時區,然後返回結果值。關於可能指定的時區的詳細論述,若自變數無效,則這個函式會返回 NULL

二. 查詢當前日期 時間

select now()                  -- 日期+時間
select sysdate()              -- 日期+時間
select current_timestamp() -- 日期+時間 select localtime() -- 日期+時間 select localtimestamp() -- 日期+時間 select curdate() -- 日期 select curtime() -- 時間 select current_time() -- 時間

sysdate() 日期時間函式跟 now() 類似,不同之處在於:now() 在執行開始時值就得到了, sysdate() 在函式執行時動態得到值
eg:select now(), sleep(3), now();

select sysdate(), sleep(3), sysdate();

三. 格式轉換

select UNIX_TIMESTAMP('2016-12-04 16:30:28')    -- 把時間轉換成時間戳
select FROM_UNIXTIME('1480581161',"%Y/%m/%d")   -- 時間戳轉換成時間

select time_to_sec('01:00:05');                 -- 時間轉換成秒 3605
select sec_to_time(3605);                       -- 秒轉換成時間 '01:00:05'

select to_days('2008-08-08');                   -- 日期轉換成天數 733627
select from_days(733627);                       -- 天數轉換成日期 '2008-08-08'

select date_format(now(),'%Y/%m/%d')            -- 日期轉化為字串
select time_format('22:23:01', '%H.%i.%s');     -- 字串轉化為時間
select str_to_date('12.12.2016 14:09:30', '%m.%d.%Y %H:%i:%s'); 
                                                -- 字串轉換為日期 2016-12-12 14:09:30

四. 時間日期選取

set @dt = '2016-12-12 11:00:19.123456';
    select date(@dt);        -- 2016-12-12(日期型別)
    select time(@dt);        -- 11:00:19.123456(日期型別)
    select year(@dt);        -- 2016
    select quarter(@dt);     -- 4 (返回的一年日期,取值範圍為1至4季度)
    select month(@dt);       -- 12
    select week(@dt);        -- 50
    select day(@dt);         -- 12
    select hour(@dt);        -- 11
    select minute(@dt);      -- 0
    select second(@dt);      -- 19
    select microsecond(@dt); -- 123456(返回微秒,在mysql中我沒有找到顯示當前微妙的函式,now()只精確到秒,也沒有找到可以儲存微妙的日期型別,,好玩的是卻可以抽取微秒)
    select dayofweek(@dt);   -- 2 (從週日算起)
    select dayofmonth(@dt);  -- 12
    select dayofyear(@dt);   -- 347
    select week(@dt);        -- 50(有mode引數)
    select weekofyear(@dt);  -- 50
    select dayofweek(@dt);   -- 2
    select weekday(@dt);     -- 0(返回日期的星期索引0=週一,1=週二,6=星期日)
    select yearweek(@dt);    -- 201650(獲取年份和週數)(有mode引數)
    select dayname(@dt);     -- Monday
    select monthname(@dt);   -- December
    select last_day(@dt);  -- 2016-12-31(返回該月份的最後一天)        

mode 引數相關 (用法 eg: select week(@dt,3);)

模式 星期的第一天 範圍 星期 1 是第一天
0 Sunday 0-53 一年中多一個星期天
1 Monday 0-53 一年多3天
2 Sunday 1-53 一年中多一個星期天
3 Monday 1-53 一年多3天
4 Sunday 0-53 一年多3天
5 Monday 0-53 一年中多一個星期一
6 Sunday 1-53 一年多3天
7 Monday 1-53 一年中多一個星期一

extract()選取函式

set @dt = '2016-12-12 11:21:19.123456';

    select extract(year                from @dt); -- 2016
    select extract(quarter             from @dt); -- 4
    select extract(month               from @dt); -- 12
    select extract(week                from @dt); -- 50
    select extract(day                 from @dt); -- 12
    select extract(hour                from @dt); -- 11
    select extract(minute              from @dt); -- 21
    select extract(second              from @dt); -- 19
    select extract(microsecond         from @dt); -- 123456

    select extract(year_month          from @dt); -- 201712
    select extract(day_hour            from @dt); -- 1211
    select extract(day_minute          from @dt); -- 121121
    select extract(day_second          from @dt); -- 12112119
    select extract(day_microsecond     from @dt); -- 12112119123456
    select extract(hour_minute         from @dt); -- 1121
    select extract(hour_second         from @dt); -- 112119
    select extract(hour_microsecond    from @dt); -- 112119123456
    select extract(minute_second       from @dt); -- 2119
    select extract(minute_microsecond  from @dt); -- 2119123456
    select extract(second_microsecond  from @dt); -- 19123456

MySQL Extract() 函式除了沒有date(),time() 的功能外,其他功能一應具全。並且還具有選取‘day_microsecond’ 等功能。注意這裡不是隻選取 day 和 microsecond,而是從日期的 day 部分一直選取到 microsecond 部分。

五. 日期加減時間間隔

set @dt = '2016-12-12 11:21:19.123456';
select date_add(@dt, interval 1 day);                   -- 2016-12-13 11:21:19.123456
select date_add(@dt, interval 1 hour);                  -- 2016-12-12 12:21:19.123456
select date_add(@dt, interval 1 minute);                -- 2016-12-12 11:22:19.123456
select date_add(@dt, interval 1 second);                -- 2016-12-12 11:21:20.123456
select date_add(@dt, interval 1 microsecond);           -- 2016-12-12 11:21:19.123457
select date_add(@dt, interval 1 week);                  -- 2016-12-19 11:21:19.123456
select date_add(@dt, interval 1 month);                 -- 2017-01-12 11:21:19.123456
select date_add(@dt, interval 1 quarter);               -- 2017-03-12 11:21:19.123456
select date_add(@dt, interval 1 year);                  -- 2017-12-12 11:21:19.123456
select date_add(@dt, interval -1 day);                  -- 2016-12-11 11:21:19.123456
select date_add(@dt, interval '01:15:30' hour_second);  -- 2016-12-12 12:36:49.123456
select date_add(@dt, interval '1 01:15:30' day_second); -- 2016-12-13 12:36:49.123456

select date_sub(@dt, interval '1 1:1:1' day_second);    -- 2016-12-11 10:20:18.123456
                                                        -- 用法同 date_add

select period_add(@dt,2);                               -- 202106 (日期加/減去N月,返回到月)

select timestampadd(day, 1, '2016-12-12 12:00:00');     -- 2016-12-13 12:00:00
select timestampadd(day, 3, now());                     -- 查詢三天後的日期

六. 日期差值計算

set @dt2 = '2010-10-10 10:10:10.123456';
set @dt1 = '2011-12-13 14:15:16.223456';

select datediff(@dt1,@dt2);             -- 429(返回天數)
select timediff(@dt1,@dt2);             -- 838:59:59.000000(返回日期型別,返回time差值)
select period_diff(@dt1,@dt2);          -- 1 (返回月數)

select timestampdiff(unit,datetime_expr1,datetime_expr2)
eg:
select timestampdiff(year,@dt1,@dt2);   -- -1
select timestampdiff(day ,@dt1,@dt2);   -- -429
select timestampdiff(hour,@dt1,@dt2);   -- -10300

七. 日期 時間 拼接

makdedate(year,dayofyear)
eg
select makedate(2001,32);   -- '2001-02-01'

maketime(hour,minute,second)
eg
select maketime(12,15,30);  -- '12:15:30'

八.format 格式化標識

%W 星期名字(Sunday……Saturday)
%D 有英語字首的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年,數字, 4 位
%y 年, 數字, 2 位
%a 縮寫的星期名字(Sun……Sat)
%d 月份中的天數, 數字(00……31)
%e 月份中的天數, 數字(0……31)
%m 月, 數字(01……12)
%c 月, 數字(1……12)
%b 縮寫的月份名字(Jan……Dec)
%j 一年中的天數(001……366)
%H 小時(00……23) %k 小時(0……23)
%h 小時(01……12) %I 小時(01……12)
%l 小時(1……12) %i 分鐘, 數字(00……59)
%r 時間,12 小時(hh:mm:ss [AP]M)
%T 時間,24 小時(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一個星期中的天數(0=Sunday ……6=Saturday )
%U 星期(0……52), 這裡星期天是星期的第一天
%u 星期(0……52), 這裡星期一是星期的第一天

九. 時間段查詢例項

表tablename,新增時間是insert_time欄位,該欄位為int(5)型別的,現需要查詢今天新增的文章總數並且按照時間從大到小排序,則查詢語句如下:

select * from tablename where date_format(from_UNIXTIME(insert_time),'%Y-%m-%d') = date_format(now(),'%Y-%m-%d');

或者:

select * from tablename where to_days(date_format(from_UNIXTIME(insert_time),'%Y-%m-%d')) = to_days(now());

表的insert_time欄位的儲存型別是DATETIME型別或者TIMESTAMP型別,則查詢語句也可按如下寫法:

查詢今天的資訊記錄:

select * from tablename where to_days(insert_time) = to_days(now());

查詢昨天的資訊記錄:

select * from tablename where to_days(now()) - to_days(insert_time) <= 1;

查詢近7天的資訊記錄:

select * from tablename where date_sub(curdate(), INTERVAL 7 DAY) <= date(insert_time);

查詢近30天的資訊記錄:

select * from tablename where date_sub(curdate(), INTERVAL 30 DAY) <= date(insert_time);

查詢本月的資訊記錄:

select * from tablename where date_format(insert_time, '%Y%m') = date_format(curdate() , '%Y%m');

查詢上一月的資訊記錄:

select * from tablename where period_diff(date_format(now() , '%Y%m') , date_format(insert_time, '%Y%m')) =1;