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指定间隔的日期

相关推荐
旺仔学长 哈哈34 分钟前
Spring Boot 智能停车场管理系统---附源码+数据库文档
数据库·spring boot·后端·智能停车场
ClickHouseDB1 小时前
ClickHouse托管Postgres:OLTP+OLAP,新能力解锁最佳数据平台
java·前端·数据库
数智化管理手记1 小时前
主数据重复、错漏频发?一站式主数据管理平台如何落地?
大数据·运维·数据库·人工智能·数据挖掘
吴声子夜歌2 小时前
MongoDB 4.2——选择片键
数据库·mongodb
天天进步一点点2 小时前
QSqlQuery删除sqlite数据库执行drop数据表报错database table is locked unable to fetch row问题
数据库·oracle·sqlite
音视频工程实战2 小时前
PromptQL 新手入门与实战指南
数据库·sql·算法
清川渡水3 小时前
NL2SQL 的正确打开方式:从「AI 猜 SQL」到「置信度闭环」的工程化落地
数据库·人工智能·sql
TDengine (老段)3 小时前
TDengine Go 与 Rust 连接器 — 高性能异步访问
大数据·数据库·物联网·golang·rust·时序数据库·tdengine
东方佑3 小时前
MA-RMSNorm:打破“缩放换智能”的魔咒,大模型归一化的一次范式革命!
数据库·人工智能·计算机视觉
云和恩墨4 小时前
「云帆计划·长沙站」活动成功举办,云和恩墨与紫薇垣和湖南金悦科技分别签约并授牌,本地伙伴生态建设加速
数据库·科技