zoukankan      html  css  js  c++  java
  • MySQL8.0中的日期类数据及其函数

    引自:https://blog.csdn.net/yeshang_lady/article/details/102836308

    1.日期类数据类型

    类型ZERO值有效值其他
    DATE '0000-00-00' ’1000-01-01’~‘9999-12-31’ 允许使用字符串或数字向date类型的列赋值
    TIME '00:00:00' '-838:59:59'~'838:59:59' 即可以表示时间(小于24)或者表示两个时间点之间的时间间隔
    DATETIME '0000-00-00 00:00:00' '1000-01-01 00:00:00'~‘9999-12-31 00:00:00’ 占8个字节。与时区无关。可以使用now()对该字段进行填充。
    TIMESTAMP '0000-00-00 00:00:00' '1970-01-01 00:00:00'  UTC~‘2038-01-19 03:14:07' UTC 占4个字节。存储时对当前的时区进行转化,检索时再转化为默认时区。可以使用current_timestramp()进行填充。
    YEAR 0000 4位数字:1901-2155 2位:00-99(1970-2069)  

    2. 日期类函数

    2.1 获取系统当前时间

    MySQL中可以获取系统当前时间的函数有很多,按照这个这些函数返回值类型的不同,可以分为三类:返回TIMESTAMP、返回DATE类型,返回TIME类型。

    函数说明
    NOW() 返回函数开始执行的日期和时间
    CURDATE() 返回当前日期
    CURTIME() 返回当前时间
    CURRENT_DATE()CURRENT_DATE 与CURDATE()相同
    CURRENT_TIEMSTAMP()CURRENT_TIMESTAMP 与NOW()相同
    CURRENT_TIME()CURRENT_TIME 与CURTIME()相同
    LOCALTIME()LOCALTIME 与NOW()相同
    LOCALTIMESTAMP()LOCALTIMESTAMP 与NOW()相同
    1.  
      SELECT
    2.  
      'TIMESTAMP' AS r_type, NOW( ) AS r1,CURRENT_TIMESTAMP( ) AS r2,CURRENT_TIMESTAMP AS r3

    运行结果如下:

    1.  
      SELECT
    2.  
      'DATE' AS r_type,CURDATE( ) AS r1,CURRENT_DATE ( ) AS r2,CURRENT_DATE AS r3

    运行结果如下:

    1.  
      SELECT
    2.  
      'TIME' AS r_type,CURTIME( ) AS r1,CURRENT_TIME ( ) AS r2,CURRENT_TIME AS r3

    运行结果如下:

    1.  
      SELECT
    2.  
      'TIMESTAMP' AS r_type, LOCALTIME() AS R1,LOCALTIME AS R2,LOCALTIMESTAMP() AS R3,LOCALTIMESTAMP AS R4

    运行结果如下:

     2.2 时区相关

    函数说明
    UTC_DATE() 返回UTC时区的日期
    UTC_TIME() 返回UTC时区的时间
    UTC_TIMESTAMP() 返回UTC时区的日期和时间
    CONVERT_TZ() 从一个时区转到另一个时区
    SELECT UTC_DATE(),UTC_TIME(),UTC_TIMESTAMP(),CURRENT_TIMESTAMP()

    运行结果如下:

     注:UTC时区又称世界同一时间、师姐协调时间,不属于任意时区。而中国北京所在的东八区要比UTC时间早8个小时。

    SELECT CONVERT_TZ('2004-01-01 12:00:00','+01:00','+10:00')
    

    运行结果如下:

    注: convert_tz(dt,from_tz,to_tz)这个函数再执行时,现将dt从from_tz转到UTC,再从UTC转到to_tz。

    SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET') AS r_1

    运行结果如下:

     注意,如果想要在convert_tz()函数中使用GMT或者MET等命名时区的时候,需要在mysql.time_zone_name表中事先指定好时区及其名称。如果没有事先指定,在运行上述代码的时候会返回NULL。

    2.3 抽取部分

    函数说明
    DATE() 抽取DATE或DATETIME的日期部分
    HOUR() 抽取小时
    TIME() 抽取时间
    EXTRACT()

    抽取日期或时间中的单独部分,其语法形式为EXTRACT(unit FROM date)。 其中unit的取值类型为:MICROSECOND(微秒)、SECOND(秒)、MINUTE(分)、HOUR(小时)、DAY(天)、WEEK(周)、MONTH(月)、QUARTER(季度)、YEAR(年)、SECOND_MICROSECOND(秒_微秒)、MINUTE_MICROSECOND(分_微秒)、MINUTE_SECOND(分_秒)、HOUR_MICROSECOND(小时_微秒)、HOUR_SECOND(小时_秒)、HOUR_MINUTE(小时_分)、DAY_MICROSECOND(天_微秒)、DAY_SECOND(天_秒)、DAY_MINUTE( 天_分)、DAY_HOUR(天_小时)、YEAR_MONTH(年_月)

    DAYNAME() 返回Monday、Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday
    DAYOFWEEK() 返回一周的第几天(取值范围从1到7)。注意,Sunday为第1天,Monday为第2天,依次类推
    DAYOFMONTH() 返回日期为当月的第几天。取值范围从1到31
    DAY() 与DAYOFMONTH()相同
    DAYOFYEAR() 返回日期I为当年的第几天。取值范围从1到366
    LAST_DAY() 返回日期所在月份的最后一天,返回日期类型
    MICROSECOND() 返回日期的微秒。如果日期中没有精确到微秒,则返回0
    MINUTE() 返回时间部分的分钟数。minute(current_date())返回0,可能是因为current_date()没有时间部分。
    MONTH() 返回月份,取值范围从1到12.
    MONTHNAME() 返回月份的英文名称:January(一月)、February(二月) 、March(三月)、April (四月)、May(五月)、June(六月)、July(七月)、August(八月)、September(九月)、October(十月)、November(十一月) 、December(十二月)
    QUARTER() 返回季度。取值范围从1到4.
    SECODN() 返回秒数。
    WEEK() 返回当前日期是该年的第几周。
    WEEKDAY() 返回日期在一周中的索引。取值范围从0到6,Monday为0,Sunday为6. 其索引开始方式与DAYOFWEEK()不同
    WEEKOFYEAR() 返回当前日期是改年的第几周。
    YEAR() 返回日期的年份
    YEARWEEK() 返回日期的年份和周数。
    1.  
      select DATE(NOW()) as r_1,HOUR(NOW()) AS r_2, TIME(NOW()) AS r_3
    2.  
      union all
    3.  
      select DATE(CURRENT_DATE()) as r_1,HOUR(CURRENT_DATE()) AS r_2, TIME(CURRENT_DATE()) AS r_3
    4.  
      union all
    5.  
      select DATE(CURTIME()) as r_1,HOUR(CURTIME()) AS r_2,TIME(CURTIME()) as r_3

    代码运行结果如下:

    注意: DATE(CURTIME())的结果。(从结果上看好像返回是当天的日期。具体原因,暂且不明) 

    1. select current_timestamp(),
    2. extract(year_month from current_timestamp()) as r_1,
    3. extract(day_hour from current_timestamp()) as r_2,
    4. extract(day_second from current_timestamp()) as r_3,
    5. extract(HOUR_MICROSECOND from current_timestamp()) as r_4,
    6. extract(MINUTE_MICROSECOND from current_timestamp())as r_5,
    7. extract(month from current_timestamp()) as r_6,
    8. extract(QUARTER from current_timestamp()) as r_7,
    9. extract(week from current_timestamp()) as r_8,
    10. extract(hour from current_timestamp()) as r_9

     代码运行结果如下:

    从上述代码运行结果可以看出,extract()函数的返回类型应当都是整数类型。其余的函数用法比较简单的就不介绍了。

    下面介绍几个关于week相关函数的用法。week()函数的完整语法形式为week(date,[mode])。mode决定了每周的第一天从星期一开始还是从星期天开始。在不同的模式下,同一日期返回的week数是不同的。具体的mode有如下8种。

    ModeFirst day of weekRangeWeek 1 is the first week …
    0 Sunday 0-53 with a Sunday in this year
    1 Monday 0-53 with 4 or more days this year
    2 Sunday 1-53 with a Sunday in this year
    3 Monday 1-53 with 4 or more days this year
    4 Sunday 0-53 with 4 or more days this year
    5 Monday 0-53 with a Monday in this year
    6 Sunday 1-53 with 4 or more days this year
    7 Monday 1-53 with a Monday in this year

     说明一下上述实验结果怎么得到的。代码太多,贴上去影响用户体验。首先我选了7个不同你那份的1月1号,这7个元旦分别发生在周一到周日,label字段就是用来说明这个1月1号是星期几的。1代表周一,以此类推。r1 3 5 7 9 11 13 15字段的值分别代表这7个不同元旦日期在8种模式下的week标号。r2 4 6 8 10 12 14 16则分别代表该元旦日期的前一天(即上一年的12月31号)对应的week标号。通过分析以上结果可以发现:

    • fisrt day of week:决定了week()函数返回值发生跳变的位置。
    • Week 1 is the first week :决定了第1周应满足的条件。
    • Range:如果range可以从0开始,如果新年的前几天不能满足对应的week 1的条件的话,则对应日期的标号为0。如果Rang从1开始,则不满足week 1标准的新的一年的前几天沿用上一年的最后一周的标号。

    weekofyear(date)等价于week(data,3),在mode=3这种模式下,每周开始的第一天为周一。range编号从1开始。

    2.4 日期运算

    函数说明
    ADDDATE() 有两种形式,ADDDATE(date,interval expr unit)和ADDDATE(date,days)。注意使用interval时,后面的unit。猜测这里能使用的unit和extract()函数中的unit差不多。当unit是secon等类型是,返回datetime形式的数据。expr可正可负。
    ADDTIME() ADDTIEM(expr1,expr2)。 expr1是datetime或time形式。expr2是时间形式
    DATE_ADD() DATE_ADD(date,intervar expr unit)等价于ADDDATE(date,interval expr unit)
    DATE_SUB() DATE_SUB(date,interval expr unit)等价与SUBDATE()
    DATE_DIFF() DATE_DIFF(expr1,expr2)求两个日期之间的差值(expr1-expr2)。如果expr1和expr2中有time部分,该部分不参与计算。
    PERIOD_ADD() PERIOD_ADD(P,N)返回P+N。其中N代表月份数 P要使用YYYY或YYYYMM形式。
    PERIOD_DIFF() PERIOD_DIFF(P1,P2) 返回两个日期之间的月份数。P1和P2要使用YYYY或YYYYMM形式。
    SUBDATE() 与ADDDATE()用法类似,作用相反。
    SUBTIME() 与ADDTIME()用法类似,作用相反。
    TIMEDIFF() TIMEDIFF(expr1,expr2)返回expr1和expr2的间隔的时间形式,expr1和expr2可以是time或date-time类型。但两者类型必须一致。
    TIMESTAMPADD()

    TIMESTAMPADD(unit, interval, datetime_expr)。返回datetime_expr+(interval)*unit表示的时间。

    TIMESTAMPDIFF() TIMESTAMPDIFF(unit, datetime_expr1,datetime_expr2)返回(datetime_expr2-datetime_expr1)/unit

    关于union all要说明的一点是: 如果要union all的各个部分中名称的相同的字段类型不同的话,union all会对字段类型进行统一。

    相关资料:

    1.https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html

  • 相关阅读:
    VS 2008潜在强大的功能:提取EXE文件中的ICO等资源
    园友们注意:淘宝网上QQ会员 4钻 3元 等都为骗子行为
    Comet Async Process Request Handler
    WCF(Sender) to MSMQ to WCF(Receiver)
    ASP.NET Web Form GridView DetailsView Query Edit
    WCF NetTcp AsyncQueue Service
    Xml CDATA 序列化
    Sync Invoke Remoting Async Invoke
    .Net 4.0 Remoting ConcurrentQueue
    Socket Async Receive Data to LinkedList Buffer (telnet proxy server)
  • 原文地址:https://www.cnblogs.com/x-jingxin/p/13924881.html
Copyright © 2011-2022 走看看