MySQL服务器中有3种时区设置:
- 系统时区(保存在system_time_zone系统变量中)
- 服务器时区(保存在全局系统变量time_zone中)
- 每个客户端连接的时区(保存在会话变量time_zone中)
其中,客户端时区的设置会影响一些日期时间函数返回值的显示,例如now(),curtime(),curdate(),也影响timestamp列值的显示。
datetime和timestamp都是日期和时间的混合类型,他们的区别:
- 表示的取值范围不同,datetime的取值范围远远大于timestamp的取值范围。
- 将NULL插入timestamp字段后,该字段的值实际上是MySQL服务器当前的日期和时间。
- 对于同一个timestamp类型的日期或者时间,不同的时区显示结果不同。使用MySQL服务器当前的日期和时间。
- 当对包含timestamp的数据的记录进行修改时,timestamp 数据将自动更新为MySQL 服务器当前的日期和时间。
mysql date数据类型的输入
日期
年月日
901101
19901101(推荐)
将字符串转为日期(年月日)
使用str_to_date 函数可以将字符串转为指定格式的日期形式输出。
mysql time数据类型的输入
时间的表示方法:
秒小数点后面可以接三位:
小数点后面三位之后的四舍五入:
在使用 str_to_date之前最好设置参数:
使用str_to_date:
datetime:
datetime str_to_date:
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
cat /usr/share/zoneinfo/Asia/Shanghai
CST-8 东8区
mysql时区
mysql里的系统时区:
mysql里的系统时区 和 linux里的时区对我们的生产几乎没有影响,我们可以不用去理会它。
我们需要关注的是全局时区
设置时区
加载时区
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';
这种方式设置的时区重启之后会消失。
如果想永久生效,需要修改配置文件 /etc/my.cnf,并重启数据库。
mysql时区正确的使用规则
mysql时区的使用
一个会话登上来,默认时区等于global_time_zone
我们要往表里的一个列存一个日期进去,往里面存的时候,这时候mysql会做一个事情,就是mysql发现你要往timestamp里面存时间,他会把会话要存的时间和会话所对应的时区合起来,换算出来你这个时间 所对应的零时区是多少,然后把时间存到列里面去
我们要取数据的时候,mysql会换算出相应的时区给你
mysql什么时候用到时区?
mysql里的表中有一个列叫timestamp的时候
session.time_zone默认情况下等于global.time_zone
查看会话时区和全局时区:
修改会话时区:
mysql时区正确时间
我们在一个会话里设置时区为东八区,我们在t16表里插入数据。
在另一个会话里设置时区为东十区,当我们查看t16表里的数据的时候,我们会发现东十区的会话的时间比东八区晚两个小时。
tiemstamp列
mysql 存时区的时候,都是转换成0时区存进系统,当取出来的时候,再转换成原来的时区取出来。
使用timestamp列时,一定要正确设置时区
获取mysql服务器当前日期或时间函数:
- curdate()、current_date() :函数用于获取 mysql 服务器当前日期;
- curtime()、current_time() : 函数用于获取mysql服务里当前的时间;
- now()、current_timestamp()、localtime() 函数以及sysdate() : 函数用于获取mysql服务器当前的日期和时间
now()、current_timestamp()、 localtime()函数以及sysdate() 函数 与时区的设置有关,根据时区设置的变化而变化。
获取mysql服务器当前Unix时间戳函数:
unix_timestamp() 函数用于获取mysql服务器当前Unix系统的时间戳,Unix的时间戳是从1970 年1月1日开始所经过的秒数。
Unix_timestamp(datetime) 函数将日期时间datetime以Unix时间戳格式返回,而 from_unixtime(timestamp) 函数可以将Unix时间戳以日期时间格式返回。这几个函数中,只有from_unixtime()函数的返回值与时区设置无关。
获取mysql服务器当前utc日期和时间函数:
utc_date() 用于获取utc日期,utc_time() 函数用来获取utc时间。utc时间就是世界标准时间。这些函数的返回值与时区的设置无关。
GMT:世界标准时间,格林尼治标准时间也叫格林威治标准时间,是指位于伦敦郊区的皇家格林尼治天文台的标准时间。
utc时间就是协调世界时,由原子钟提供,在时刻上尽量接近于世界时的一种时间计量系统。
这些函数的返回值与时区的设置无关。
EDT(Eastern Daylight Timing)指美国东部夏令时间。东部时区慢北京时间12小时。
EST eastern standard time (美国)东部标准时间 慢北京时间 13个小时。
获取日期或时间的某一具体信息的函数
(1)获取年、月、日、时、分、秒、微秒的信息
year(x)、month(x)、dayofmonth(x)、hour(x)、minute(x)、second(x)、microsecond(x) 函数。
extract(type from x) 函数用法与上类似。
(2)获取月份、星期等信息的函数:
monthname(x) 函数 获取日期时间(x) 的月份信息。daytime(x)函数与weekday(x) 函数用于获取日期时间x的星期信息,dayofweek(x) 函数用于获取日期时间 x 是本星期的第几天;
(3)获取年度信息的函数
quarter(x) 函数用于获取日期时间在本年是第几季度,week(x) 函数与weekofyear(x) 函数用于获取日期时间x在本年是第几个星期;dayofyear(x) 用于获取x在本年是第几天。
时间和秒数之间的转换
time_to_sec(x) 函数用于获取时间x在当天的秒数;sec_to_time(x) 用于获取当天的秒数对应的时间。
日期间隔、时间间隔函数
(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天的日期。
(2)时间间隔函数
addtime(t,n) 函数返回起始时间t加上n秒的时间,subtime(t,n) 函数返回起始时间t减去n秒的时间。
(3)计算指定日期时间指定间隔的日期函数。
date_add(date,interval间隔 间隔类型)函数返回指定日期date指定间隔的日期