mysql中的时间相关函数

MySQL服务器中有3种时区设置:

  • 系统时区(保存在system_time_zone系统变量中)
  • 服务器时区(保存在全局系统变量time_zone中)
  • 每个客户端连接的时区(保存在会话变量time_zone中)

其中,客户端时区的设置会影响一些日期时间函数返回值的显示,例如now(),curtime(),curdate(),也影响timestamp列值的显示。


datetime和timestamp都是日期和时间的混合类型,他们的区别:

  1. 表示的取值范围不同,datetime的取值范围远远大于timestamp的取值范围。
  2. 将NULL插入timestamp字段后,该字段的值实际上是MySQL服务器当前的日期和时间。
  3. 对于同一个timestamp类型的日期或者时间,不同的时区显示结果不同。使用MySQL服务器当前的日期和时间。
  4. 当对包含timestamp的数据的记录进行修改时,timestamp 数据将自动更新为MySQL 服务器当前的日期和时间。

mysql date数据类型的输入

日期
年月日
901101
19901101(推荐)
image.png

将字符串转为日期(年月日)

使用str_to_date 函数可以将字符串转为指定格式的日期形式输出。
image.png
image.png


mysql time数据类型的输入

时间的表示方法:
image.png
秒小数点后面可以接三位:
image.png
小数点后面三位之后的四舍五入:
image.png
在使用 str_to_date之前最好设置参数:
image.png
使用str_to_date:
image.png
datetime:
image.png
datetime str_to_date:
image.png


date和time的显示方式

对时间的定制:date_format
在mysql中,DATE_FORMAT(date, format) 函数根据format字符串格式化date值。

%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), 这里星期一是星期的第一天 
%% 	一个文字“%”。 

os时区

操作系统的时区:
cat /etc/sysconfig/clock
cat /usr/share/zoneinfo/Asia/Shanghai
系统时区
show variable like 'system%';
全局时区 ——默认等于系统时区
select @@global.time_zone;
会话时区
select @@session.time_zone;
设置时区
set @@global.time_zone='+8:00';

cat /etc/sysconfig/clock
image.png
cat /usr/share/zoneinfo/Asia/Shanghai
image.png
CST-8 东8区


mysql时区

mysql里的系统时区:
image.png
mysql里的系统时区 和 linux里的时区对我们的生产几乎没有影响,我们可以不用去理会它。
我们需要关注的是全局时区
image.png
设置时区
image.png
加载时区
mysql_tzinfo_to_sql 程序导入时区信息到mysql数据库中。

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -pxxxxxxx mysql
select * from mysql.time_zone_name;
set time_zone='Asia/Shanghai'

先执行一个脚本,然后再查看数据库里的内容,最后再设置时区。
set time_zone='Asia/Shanghai'; 这种方式设置的时区重启之后会消失。
image.png


如果想永久生效,需要修改配置文件 /etc/my.cnf,并重启数据库。

image.png
image.png


mysql时区正确的使用规则

mysql时区的使用

一个会话登上来,默认时区等于global_time_zone
我们要往表里的一个列存一个日期进去,往里面存的时候,这时候mysql会做一个事情,就是mysql发现你要往timestamp里面存时间,他会把会话要存的时间和会话所对应的时区合起来,换算出来你这个时间 所对应的零时区是多少,然后把时间存到列里面去
我们要取数据的时候,mysql会换算出相应的时区给你

mysql什么时候用到时区?

mysql里的表中有一个列叫timestamp的时候
session.time_zone默认情况下等于global.time_zone

查看会话时区和全局时区:

image.png
修改会话时区:
image.png


mysql时区正确时间

我们在一个会话里设置时区为东八区,我们在t16表里插入数据。
image.png

在另一个会话里设置时区为东十区,当我们查看t16表里的数据的时候,我们会发现东十区的会话的时间比东八区晚两个小时。
image.png


tiemstamp列
mysql 存时区的时候,都是转换成0时区存进系统,当取出来的时候,再转换成原来的时区取出来。
使用timestamp列时,一定要正确设置时区

获取mysql服务器当前日期或时间函数:

  • curdate()、current_date() :函数用于获取 mysql 服务器当前日期;
  • curtime()、current_time() : 函数用于获取mysql服务里当前的时间;
  • now()、current_timestamp()、localtime() 函数以及sysdate() : 函数用于获取mysql服务器当前的日期和时间

now()、current_timestamp()、 localtime()函数以及sysdate() 函数 与时区的设置有关,根据时区设置的变化而变化。
image.png

获取mysql服务器当前Unix时间戳函数:

unix_timestamp() 函数用于获取mysql服务器当前Unix系统的时间戳,Unix的时间戳是从1970 年1月1日开始所经过的秒数。
Unix_timestamp(datetime) 函数将日期时间datetime以Unix时间戳格式返回,而 from_unixtime(timestamp) 函数可以将Unix时间戳以日期时间格式返回。这几个函数中,只有from_unixtime()函数的返回值与时区设置无关。
image.png

获取mysql服务器当前utc日期和时间函数:

utc_date() 用于获取utc日期,utc_time() 函数用来获取utc时间。utc时间就是世界标准时间。这些函数的返回值与时区的设置无关。
GMT:世界标准时间,格林尼治标准时间也叫格林威治标准时间,是指位于伦敦郊区的皇家格林尼治天文台的标准时间。
utc时间就是协调世界时,由原子钟提供,在时刻上尽量接近于世界时的一种时间计量系统。
这些函数的返回值与时区的设置无关。
EDT(Eastern Daylight Timing)指美国东部夏令时间。东部时区慢北京时间12小时。
EST eastern standard time (美国)东部标准时间 慢北京时间 13个小时。
image.png

获取日期或时间的某一具体信息的函数

(1)获取年、月、日、时、分、秒、微秒的信息
year(x)、month(x)、dayofmonth(x)、hour(x)、minute(x)、second(x)、microsecond(x) 函数。
extract(type from x) 函数用法与上类似。
image.png
(2)获取月份、星期等信息的函数:
monthname(x) 函数 获取日期时间(x) 的月份信息。daytime(x)函数与weekday(x) 函数用于获取日期时间x的星期信息,dayofweek(x) 函数用于获取日期时间 x 是本星期的第几天;
image.png
(3)获取年度信息的函数
quarter(x) 函数用于获取日期时间在本年是第几季度,week(x) 函数与weekofyear(x) 函数用于获取日期时间x在本年是第几个星期;dayofyear(x) 用于获取x在本年是第几天。
image.png

时间和秒数之间的转换

time_to_sec(x) 函数用于获取时间x在当天的秒数;sec_to_time(x) 用于获取当天的秒数对应的时间。
image.png

日期间隔、时间间隔函数

(1)日期时间间隔函数
to_days(x)用于计算日期x距离0000年1月1日的天数;from_days(X)函数用于计算从0000年1月1日开始n天后的日期,datediff(x1,x2) 用于计算日期x1和x2之间的相隔天数;adddate(d,n) 返回起始日期d加上n天后的日期;subdate(d,n) 返回起始日期d减去n天的日期。
image.png
(2)时间间隔函数
addtime(t,n) 函数返回起始时间t加上n秒的时间,subtime(t,n) 函数返回起始时间t减去n秒的时间。
image.png
(3)计算指定日期时间指定间隔的日期函数。
date_add(date,interval间隔 间隔类型)函数返回指定日期date指定间隔的日期
image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aurevoirs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值