zoukankan      html  css  js  c++  java
  • MySQL 日期时间函数

    datetime和timestamp区别:

    1. 存储方式不一样,IMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于DATETIME,不做任何改变,基本上是原样输入和输出。
    2. 占用存储空间不同。timestamp储存占用4个字节,datetime储存占用8个字节
    3. 可表示的时间范围不同。timestamp可表示范围:1970-01-01 00:00:00~2038-01-09 03:14:07,datetime支持的范围更宽1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
    4. TIMESTAMP类型在默认情况下,insert、update 数据时,TIMESTAMP列会自动以当前时间(CURRENT_TIMESTAMP)填充/更新。
    5. 索引速度不同。timestamp更轻量,索引相对datetime更快。

    timestamp类型字段特殊性:

    timestamp类型在自动初始化的时候,会自动设置成当前时间,会自动更新,默认的设置为:

    `field` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    

    如果不想要这样,可以将timestamp设置为默认为空或者设置具体的默认值。

    具体可以查看文章底部链接。


    Mysql获取日期时间函数:

    now()

    sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值。

    mysql> select now(), sleep(3), now();
    
    +---------------------+----------+---------------------+
    | now() | sleep(3) | now() |
    +---------------------+----------+---------------------+
    | 2008-08-08 22:28:21 | 0 | 2008-08-08 22:28:21 |
    +---------------------+----------+---------------------+
    
    mysql> select sysdate(), sleep(3), sysdate();
    
    +---------------------+----------+---------------------+
    | sysdate() | sleep(3) | sysdate() |
    +---------------------+----------+---------------------+
    | 2008-08-08 22:28:41 | 0 | 2008-08-08 22:28:44 |
    +---------------------+----------+---------------------+
    

    可以看到,虽然中途 sleep 3 秒,但 now() 函数两次的时间值是相同的; sysdate() 函数两次得到的时间值相差 3 秒.

    curdate()

    select curdate();
    
    +------------+
    | curdate() |
    +------------+
    | 2008-08-08 |
    +------------+
    

    其中,下面的两个日期函数等同于 curdate():
    current_date() ,current_date

    curtime()

     select curtime();
    
    +-----------+
    | curtime() |
    +-----------+
    | 22:41:30 |
    +-----------+
    

    其中,下面的两个时间函数等同于 curtime():
    current_time() ,current_time

    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
    

    last_day()

    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;
    
    +---------------------+------+
    | now() | days |
    +---------------------+------+
    | 2008-08-09 11:45:45 | 31 |
    +---------------------+------+
    

    Mysql日期时间计算函数:

    date_add()

    set @dt = now();
    
    select date_add(@dt, interval 1 day); -- add 1 day
    select date_add(@dt, interval 1 hour); -- add 1 hour
    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); -- sub 1 day
    

    MySQL adddate(), addtime()函数,可以用 date_add() 来替代。

    下面是 date_add() 实现 addtime() 功能示例:

     set @dt = '2008-08-09 12:12:33';
     
     select date_add(@dt, interval '01:15:30' hour_second);
    
    +------------------------------------------------+
    | date_add(@dt, interval '01:15:30' hour_second) |
    +------------------------------------------------+
    | 2008-08-09 13:28:03 |
    +------------------------------------------------+
    
     select date_add(@dt, interval '1 01:15:30' day_second);
    
    +-------------------------------------------------+
    | date_add(@dt, interval '1 01:15:30' day_second) |
    +-------------------------------------------------+
    | 2008-08-10 13:28:03 |
    +-------------------------------------------------+
    

    date_add() 函数,分别为 @dt 增加了“1小时 15分 30秒” 和 “1天 1小时 15分 30秒”。

    date_sub()

    select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);
    
    +----------------------------------------------------------------+
    | date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |
    +----------------------------------------------------------------+
    | 1997-12-30 22:58:59 |
    +----------------------------------------------------------------+
    

    date_sub() 日期时间函数 和 date_add() 用法一致,不再赘述。

    另外,MySQL 中还有两个函数 subdate(), subtime(),建议,用 date_sub() 来替代。

    datediff(),timediff()

    日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)

    MySQL 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(time1,time2) 函数的两个参数类型必须相同。

    str_to_date()

    (字符串转换为日期)函数:str_to_date(str, format)

    select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09
    select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09
    select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09
    select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30
    select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30
    

    date_format(),time_format()

    将日期,时间转换成字符串,是str_to_date()的逆转换

    select date_format('2008-08-08 22:23:00', '%W %M %Y');
    
    +------------------------------------------------+
    | date_format('2008-08-08 22:23:00', '%W %M %Y') |
    +------------------------------------------------+
    | Friday August 2008 |
    +------------------------------------------------+
    
    select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s');
    
    +----------------------------------------------------+
    | date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') |
    +----------------------------------------------------+
    | 20080808222301 |
    +----------------------------------------------------+
    
     select time_format('22:23:01', '%H.%i.%s');
    
    +-------------------------------------+
    | time_format('22:23:01', '%H.%i.%s') |
    +-------------------------------------+
    | 22.23.01 |
    +-------------------------------------+
    

    MySQL 时区(timezone)转换函数:

    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:日期函数、时间函数总结(MySQL 5.X)

    MySQL 日期与时间方面的函数

    mysql之DATETIME、DATE和TIMESTAMP简单了解

    MySQL中有关TIMESTAMP和DATETIME的总结

  • 相关阅读:
    WHERE col1=val1 AND col2=val2;index exists on col1 and col2, the appropriate rows can be fetched directly
    MySQL 交集 实现方法
    MBProgressHUD的使用
    Xcode4 使用 Organizer 分析 Crash logs(转)
    SimpleXML 使用详细例子
    PHP的XML Parser(转)
    iPhone,iPhone4,iPad程序启动画面的总结 (转)
    Pop3得到的Email 信件格式介绍
    yii总结
    隐藏Tabbar的一些方法
  • 原文地址:https://www.cnblogs.com/hongdada/p/9929332.html
Copyright © 2011-2022 走看看