MySQL8.0中的日期类数据及其函数

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()进行填充。
YEAR00004位数字: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()相同
SELECT
	'TIMESTAMP' AS r_type, NOW( ) AS r1,CURRENT_TIMESTAMP( ) AS r2,CURRENT_TIMESTAMP AS r3 

运行结果如下:

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

运行结果如下:

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

运行结果如下:

SELECT
	'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()返回日期的年份和周数。
select DATE(NOW()) as r_1,HOUR(NOW()) AS r_2, TIME(NOW()) AS r_3
union all
select DATE(CURRENT_DATE()) as r_1,HOUR(CURRENT_DATE()) AS r_2, TIME(CURRENT_DATE()) AS r_3
union all
select DATE(CURTIME()) as r_1,HOUR(CURTIME()) AS r_2,TIME(CURTIME()) as r_3

代码运行结果如下:

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

select current_timestamp(),
			extract(year_month from current_timestamp()) as r_1,
			extract(day_hour from current_timestamp()) as r_2,
			extract(day_second from current_timestamp()) as r_3,
			extract(HOUR_MICROSECOND from current_timestamp()) as r_4,
			extract(MINUTE_MICROSECOND from current_timestamp())as r_5,
			extract(month from current_timestamp()) as r_6,
			extract(QUARTER from current_timestamp()) as r_7,
			extract(week from current_timestamp()) as r_8,
			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 …
0Sunday0-53with a Sunday in this year
1Monday0-53with 4 or more days this year
2Sunday1-53with a Sunday in this year
3Monday1-53with 4 or more days this year
4Sunday0-53with 4 or more days this year
5Monday0-53with a Monday in this year
6Sunday1-53with 4 or more days this year
7Monday1-53with a Monday in this year

 说明一下上述实验结果怎么得到的。代码太多,贴上去影响用户体验。首先我选了7个不同你那份的1月1号,这7个元旦分别发生在周一到周日,label字段就是用来说明这个1月1号是星期几的。1代表周一,以此类推。r1\r3\r5\r7\r9\r11\r13\r15字段的值分别代表这7个不同元旦日期在8种模式下的week标号。r2\r4\r6\r8\r10\r12\r14\r16则分别代表该元旦日期的前一天(即上一年的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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 8.0版本提供了一些常用的开窗函数,比如row_number(),rank(),dense_rank(),NTILE()和PERCENT_RANK()等等。 这些窗口函数可以在查询结果集的特定窗口进行计算,以实现更复杂的数据分析和聚合操作。你可以在MySQL官方文档找到这些函数的详细说明和用法:https://dev.mysql.com/doc/refman/8.0/en/window-functions.html 在MySQL 8.0,行窗口是指一组连续的行,这些行被视为一个整体,并且可以用于窗口函数的计算。 这些开窗函数使得在查询结果根据特定条件对行进行排序、分组或计数变得更加便捷和灵活。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MYSQL8.0新特性开窗函数体验报告](https://blog.csdn.net/weixin_36303305/article/details/113283594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MySQL8.0数据库开窗函数](https://blog.csdn.net/weixin_50002038/article/details/131011696)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值