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(推荐)

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

使用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值。

sql 复制代码
%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数据库中。

sql 复制代码
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指定间隔的日期

相关推荐
litGrey20 分钟前
Maven国内镜像(四种)
java·数据库·maven
huaqianzkh1 小时前
了解MySQL 高可用架构:主从备份
数据库·mysql·架构
向往风的男子2 小时前
【mysql】mysql之读写分离以及分库分表
数据库·mysql
阳光开朗_大男孩儿3 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
挠背小能手3 小时前
达梦数据库SCHEMA使用初探
数据库·oracle
楠神说软件测试3 小时前
接口自动化框架入门(requests+pytest)
运维·数据库·自动化
惟长堤一痕3 小时前
医学数据分析实训 项目一 医学数据采集
数据库
xuan哈哈哈3 小时前
web基础—dvwa靶场(八)SQL Injection(Blind)
数据库·web安全·网络安全
Lill_bin4 小时前
Lua编程语言简介与应用
开发语言·数据库·缓存·设计模式·性能优化·lua
听说唐僧不吃肉4 小时前
Shell篇之编写MySQL启动脚本
mysql