1 时间类型
MySQL保存日期格式使用 YYYY-MM-DD HH:MM:SS的ISO 8601标准
向数据表储存日期与时间必须使用ISO格式
DATATIME与TIMESTAMP的差异区别
在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。
1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。
2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在MySQL服务器,操作系统以及客户端连接都有时区的设置。
3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。
4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。
2 基本操作
以下示例将创建一张数据表,并且插入一些时间类型的数据。
使用now()函数可获取当前时间
mysql>
也可以使用字符串的形式进行插入,但是要严格按照格式进行插入。
mysql>
3 设默认值
使用DATATIME时由于其没有默认值的设定,故我们需要为它设定默认值。
以下示例将演示创建出一张user表,并设置regtime字段,不用手动插入时间而是自动生成。
mysql>
4 查询格式化
4|1参数介绍
格式 描述
%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 位
4|2操作演示
Date_format(字段,格式化内容)或者TIME_FORMAT(字段,格式化内容)用于格式化时间
注意:TIME_FORMAT()只包含时分秒,并不包含年月日
以下示例将创建一张temp表,并拥有时间类型字段ct,对他进行查询格式化操作。
mysql>
5 常用函数
5|1获取时间
获取当前完整时间可使用函数now()
只获取部分时间可使用部分时间的函数对其进行包裹
mysql>
其他可以使用的函数如下
函数 说明
不需要包裹
NOW() 当前时间,完整的年月日时分秒
CURRENT_DATE() 当前日期,年月日
CURRENT_TIME() 当前时间,时分秒
需要包裹
YEAR() 年(范围从1000 到 9999)
MONTH() 月(范围从1到12)
DAY() 日(范围从1开始)
HOUR() 时(范围从0到23)
MINUTE() 分(范围从0到59)
SECOND() 秒(范围从0到59)
TIME() 只获取时间,即时分秒。
WEEK() 一年中的第几周,从1开始计数
QUARTER() 一年中的季度,从1开始计数
DAYOFYEAR() 一年中的第几天(从1开始)
DAYOFMONTH() 月份中天数(从1开始)
DAYOFWEEK() 星期天(1)到星期六(7)
WEEKDAY() 星期一(0)到星期天(6)
TO_DAYS() 从元年到现在的天数(忽略时间部分)
FROM_DAYS() 根据天数得到日期(忽略时间部分)
TIME_TO_SEC() 时间转为秒数(忽略日期部分)
SEC_TO_TIME() 根据秒数转为时间(忽略日期部分)
UNIX_TIMESTAMP() 根据日期返回秒数(包括日期与时间)
FROM_UNIXTIME() 根据秒数返回日期与时间(包括日期与时间)
DATEDIFF() 两个日期相差的天数(忽略时间部分,前面日期减后面日期)
TIMEDIFF() 计算两个时间的间隔(忽略日期部分)
TIMESTAMPDIFF() 根据指定单位计算两个日期时间的间隔(包括日期与时间)
LAST_DAY() 该月的最后一天
5|2时间拆分
以下示例将展示将某一时间拆分成不同的部分
mysql>
5|3当前时间
以下示例将展示如何获取当前时间
mysql>
5|4时间计算
以下示例将展示计算出当前时间位于一年中的第几周,季度,第几天。
mysql>
5|5时间转换
以下示例将展示如何进行不包含日期的秒转换
mysql>
以下示例将展示如何进行日期时间与秒转换
mysql>
以下示例将展示如何进行日期时间与天数转换
mysql>
5|6差值计算
以下示例将展示如何进行计算天数差值,忽略时间部分
mysql>
以下示例将展示如何进行计算时间差值,忽略天数
mysql>
5|7差值单位
使用timestampdiff()可指定差值单位,支持的单位有 YEAR/MONTH/WEEK/DAY/HOUR/MINUTE/SECOND等
注意,这个是后面减前面
mysql>
6 时间计算
函数 说明
ADDTIME 添加时间(负数为减少),只对时间有效
TIMESTAMP 添加时间(负数为减少),只对时间有效
DATE_ADD 根据单位添加时间,支持单位有YEAR/MONTH/DAY/HOUR/MINUTE/SECOND/HOUR_MINUTE/DAY_HOUR/DAY_MINUTE/DAY_SECOND/HOUR_MINUTE/HOUR_SECOND(负数时等于DATE_SUB)
DATE_SUB DATE_ADD的反函数
LAST_DAY 指定月最后一天日期
七小时前的时间
mysql>
七天后的日期
mysql>
20小时10分钟后的日期
mysql>
2天8小时后的日期
mysql>
获取本月最后一天日期
mysql>
获取本月的第一天日期
mysql>
7 查询使用
MySQL内部将日期按数值进行处理,下面是查找'1990-02-22 09:00:00' 日期可以写成数值形式
SELECT * FROM users WHERE birthday = 19900222090000
当然也可以写成字符串格式,查找在 1990~1999年出生的同学
SELECT * FROM stu WHERE birthday BETWEEN '1990-01-01' AND '1999-12-31';