在我们处理数据库时间的后,往往会存在一个时间格式匹配问题,当一个时间去匹配日期格式的数据操作时,就必然会带来一些问题。本篇文章主要记录一下在mysql中时间处理中存在的一些问题,我会主要介绍mysql相关时间函数的使用说明;当然,无论是在mysql还是sqlserver中,时间函数的功能大致都相同,但可能不同的是函数名和参数格式的不同,若各位所需,可自行查阅。
介绍时间函数之前,我先记录一下我遇到过的两个问题,可能两个问题风马牛不相及,但是还是值得在此记录一下,以防忘记。
在新装mysql数据库的时候,若不进行配置,默认时区为服务器所在时区,
其中包括24个时区,每一时区由一个英文字母表示。每隔经度15°划分一个时区:
时区 |
时区范围 |
时区中心线 |
---|---|---|
UTC |
7.5°W~7.5°E |
0° |
UTC+1 |
7.5°E~22.5°E |
15°E |
UTC+2 |
22.5°E~37.5°E |
30°E |
UTC+3 |
37.5°E~52.5°E |
45°E |
UTC+4 |
52.5°E~67.5°E |
60°E |
UTC+5 |
67.5°E~82.5°E |
75°E |
UTC+6 |
82.5°E~97.5°E |
90°E |
UTC+7 |
97.5°E~112.5°E |
105°E |
UTC+8 |
112.5°E~127.5°E |
120°E |
UTC+9 |
127.5°E~142.5°E |
135°E |
UTC+10 |
142.5°E~157.5°E |
150°E |
UTC+11 |
157.5°E~172.5°E |
165°E |
东西十二区 |
172.5°E~172.5°W |
180° |
UTC-11 |
172.5°W~157.5°W |
165°W |
UTC-10 |
157.5°W~142.5°W |
150°W |
UTC-9 |
142.5°W~127.5°W |
135°W |
UTC-8 |
127.5°W~112.5°W |
120°W |
UTC-7 |
112.5°W~97.5°W |
105°W |
UTC-6 |
97.5°W~82.5°W |
90°W |
UTC-5 |
82.5°W~67.5°W |
75°W |
UTC-4 |
67.5°W~52.5°W |
60°W |
UTC-3 |
52.5°W~37.5°W |
45°W |
UTC-2 |
37.5°W~22.5°W |
30°W |
UTC-1 |
22.5°W~7.5°W |
15°W |
比如,我在中国,我们属于东八区,UTC+8。
如果数据库时区有误,我们可以通过以下方式修改:
spring:
datasource:
url: jdbc:mysql://localhost:3306/springbootdemo?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
serverTimezone=GMT%2B8 设置当前时区为东八时区 GMT:格林标准时间 GMT, %2B:在html中标识+,8:时区
依据自己的时区来,你的服务器在哪个时区就设置为哪个时区的参数。
在我们开发中,很多情况下需要和前端进行交互操作,那么,数据的统一性就很有必要了,它能提高我们得开发效率,避免扯皮,哈哈哈。这里,我以时间戳为统一格式为大家讲解。在我们将数据库中的时间数据查出来后,在java一般使用date类型来进行中转,返回前端后,会默认以格林时间显示Thu May 18 2017 00:00:00 GMT+0800,当然,我们可以进行时间串格式化等等操作来得到我们想要的具体某种时间格式,2017/05/18 之类的。如果您也恰好使用的时间格式为时间戳,也采用的是springboot的微服务模式,那么你很幸运,有一个简单的配置,即可将date类型的时间以json时间戳返回至页面。
spring.jackson.serialization.write-dates-as-timestamps: true
这是在properties文件中的配置方法,若采用的yml文件格式,那么找到相应的路径,注意空格,就可以了。
好了,讲了这些,也该进入今天的正题了,对mysql时间函数的知识点讲解。
首先,我们先来熟悉一下mysql中有哪些内置时间函数:MYSQL
函数 | 描述 |
---|---|
NOW() | 返回当前的日期和时间 |
CURDATE() | 返回当前的日期 |
CURTIME() | 返回当前的时间 |
DATE() | 提取日期或日期/时间表达式的日期部分 |
EXTRACT() | 返回日期/时间按的单独部分 |
DATE_ADD() | 给日期添加指定的时间间隔 |
DATE_SUB() | 从日期减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的天数 |
DATE_FORMAT() | 用不同的格式显示日期/时间 |
还是给你们找了下sqlServer的时间函数,大家对比一下,是不是差不多。意思相近。SQL Server
函数 | 描述 |
---|---|
GETDATE() | 返回当前日期和时间 |
DATEPART() | 返回日期/时间的单独部分 |
DATEADD() | 在日期中添加或减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的时间 |
CONVERT() | 用不同的格式显示日期/时间 |
NOW(),没有参数,返回当前时间,无需更多讲解。注意这里的所有时间函数操作的时间都以数据时间为准,也就是说,你的数据库在哪个时区就以哪个时区的时间为准。
CURDATE(),获取当前日期,看好哦,这里是获取日期,不带时分秒的那种,格式:yyyy-mm-dd
CURTIME(),获取当前时间。这个和上面获取当前时间就一点不同,一个是获取日期,一个是获取时间,不含年月日,只有时分秒,格式:HH:MM:SS
DATE(),截取有效时间的日期部分,何为有效时间,格式为:yyyy-mm-dd HH:MM:ss 等格式,只要能识别的正常时间就行。带点毫秒也可以的。
EXTRACT(),对于一个指定的时间,获取这个时间的unit 值,这个函数的函数表达式为EXTRACT(unit from date);unit的值,下面有一张表。给大家详细说明到底获取这个时间的年、月、日还是时、分、秒还是时间间隔等。
其实是在不同状态下获取时分秒,还搞得挺细,不错不错。
DATE_ADD(),语法格式:DATE_ADD(date,INTERVAL expr type),其中:date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。type 参数可以是下列值:(就是说加入type为DAY,expr为1,就给这个时间加一天,得到一个加一天后的返回日期,expr为正数就+,为负数就-)
发现没有,此图和上面的EXTRACT()函数的unit值是一样的,所以说啊,很多东西都是差不多滴。
DATE_SUB(),这个和上面那个差不多我就不写了,一个是加一个是减,其实一个加就可以实现减时间间隔的操作了。
DATEDIFF(),DATEDIFF(datepart,startdate,enddate);datepart:间隔时间单位,startdate:开始时间 ,enddate:结束时间,这里注意下,时间格式统一为标准格式 yyyy-mm-dd hh:mm:ss
datepart | 缩写 |
---|---|
年 | yy, yyyy |
季度 | qq, q |
月 | mm, m |
年中的日 | dy, y |
日 | dd, d |
周 | wk, ww |
星期 | dw, w |
小时 | hh |
分钟 | mi, n |
秒 | ss, s |
毫秒 | ms |
微妙 | mcs |
纳秒 | ns |
DATE_FORMAT();以不同的时间格式显示日期,DATE_FORMAT(date,format) format为时间格式。
格式 | 描述 |
---|---|
%a | 缩写星期名 |
%b | 缩写月名 |
%c | 月,数值 |
%D | 带有英文前缀的月中的天 |
%d | 月的天,数值(00-31) |
%e | 月的天,数值(0-31) |
%f | 微秒 |
%H | 小时 (00-23) |
%h | 小时 (01-12) |
%I | 小时 (01-12) |
%i | 分钟,数值(00-59) |
%j | 年的天 (001-366) |
%k | 小时 (0-23) |
%l | 小时 (1-12) |
%M | 月名 |
%m | 月,数值(00-12) |
%p | AM 或 PM |
%r | 时间,12-小时(hh:mm:ss AM 或 PM) |
%S | 秒(00-59) |
%s | 秒(00-59) |
%T | 时间, 24-小时 (hh:mm:ss) |
%U | 周 (00-53) 星期日是一周的第一天 |
%u | 周 (00-53) 星期一是一周的第一天 |
%V | 周 (01-53) 星期日是一周的第一天,与 %X 使用 |
%v | 周 (01-53) 星期一是一周的第一天,与 %x 使用 |
%W | 星期名 |
%w | 周的天 (0=星期日, 6=星期六) |
%X | 年,其中的星期日是周的第一天,4 位,与 %V 使用 |
%x | 年,其中的星期一是周的第一天,4 位,与 %v 使用 |
%Y | 年,4 位 |
%y | 年,2 位 |
总结:内置时间函数只是方便我们的一般使用,具体实现还需要灵活运用。第一篇博客,记录一下。fighting!