前言:

在项目开发中,一些业务表字段经常使用日期和时间类型,而且后续还会牵涉到这类字段的查询。关于日期及时间的查询等各类需求也很多,本篇文章简单讲讲日期及时间字段的规范化查询方法。

1.日期和时间类型概览

MySQL支持的日期和时间类型有 DATETIME、TIMESTAMP、DATE、TIME、YEAR ,几种类型比较如下:

涉及到日期和时间字段类型选择时,根据存储需求选择合适的类型即可。

2.日期和时间相关函数

处理日期和时间字段的函数有很多,有的经常会在查询中使用到,下面介绍下几个相关函数的使用方法。

  • CURDATE 和 CURRENT_DATE 两个函数作用相同,返回当前系统的日期值。
  • CURTIME 和 CURRENT_TIME 两个函数作用相同,返回当前系统的时间值。
  • NOW() 和 SYSDATE() 两个函数作用相同,返回当前系统的日期和时间值。
  • UNIX_TIMESTAMP 获取UNIX时间戳函数,返回一个以 UNIX 时间戳为基础的无符号整数。
  • FROM_UNIXTIME 将 UNIX 时间戳转换为时间格式,与UNIX_TIMESTAMP互为反函数。
  • TO_DAYS() 提取日期值并返回自公元0年到现在的天数。
  • DAY() 获取指定日期或时间中的天值。
  • DATE() 获取指定日期或时间中的日期。
  • TIME() 获取指定日期或时间中的时间。
  • MONTH 获取指定日期中的月份。
  • WEEK 获取指定日期是一年中的第几周。
  • YEAR 获取年份。
  • QUARTER 获取日期所在的季度值。
  • DATE_ADD 和 ADDDATE 两个函数功能相同,都是向日期添加指定的时间间隔。
  • DATE_SUB 和 SUBDATE 两个函数功能相同,都是向日期减去指定的时间间隔。
  • ADDTIME 时间加法运算,在原始时间上添加指定的时间。
  • SUBTIME 时间减法运算,在原始时间上减去指定的时间。
  • DATEDIFF 获取两个日期之间间隔,返回参数 1 减去参数 2 的值。
  • DATE_FORMAT 格式化指定的日期,根据参数返回指定格式的值。

一些使用示例:

mysql> select CURRENT_DATE,CURRENT_TIME,NOW();+--------------+--------------+---------------------+| CURRENT_DATE | CURRENT_TIME | NOW()        |+--------------+--------------+---------------------+| 2020-06-03  | 15:09:37   | 2020-06-03 15:09:37 |+--------------+--------------+---------------------+mysql> select TO_DAYS('2020-06-03 15:09:37'),TO_DAYS('2020-06-03')-TO_DAYS('2020-06-01');+--------------------------------+---------------------------------------------+| TO_DAYS('2020-06-03 15:09:37') | TO_DAYS('2020-06-03')-TO_DAYS('2020-06-01') |+--------------------------------+---------------------------------------------+|             737944 |                      2 |+--------------------------------+---------------------------------------------+mysql> select MONTH('2020-06-03'),WEEK('2020-06-03'),YEAR('2020-06-03');+---------------------+--------------------+--------------------+| MONTH('2020-06-03') | WEEK('2020-06-03') | YEAR('2020-06-03') |+---------------------+--------------------+--------------------+|          6 |         22 |        2020 |+---------------------+--------------------+--------------------+# DATEDIFF(date1,date2) 返回起始时间 date1 和结束时间 date2 之间的天数mysql> SELECT DATEDIFF('2017-11-30','2017-11-29') AS COL1,  -> DATEDIFF('2017-11-30','2017-12-15') AS col2;+------+------+| COL1 | col2 |+------+------+|  1 | -15 |+------+------+

上面的内容都是为我们的查询需求做准备,在项目需求中,经常会以日期或时间为条件进行筛选查询。有时候这类需求多种多样,下面我们来学习下关于日期和时间字段的查询写法。

首先,为了使查询更加准确,在插入数据时也要按规范来插入。比如说年份使用4位数字,日期和月份要在合理范围内等,下面为了测试方便,我们创建一个表,并插入部分数据。

CREATE TABLE `t_date` (`increment_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',`year_col` YEAR NOT NULL COMMENT '年',`date_col` date NOT NULL COMMENT '日期',`time_col` time NOT NULL COMMENT '时间',`dt_col` datetime NOT NULL COMMENT 'datetime时间',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`increment_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='time测试表';# 日期和时间都选取当前的日期或时间INSERT INTO t_date (year_col,date_col,time_col,dt_col,create_time) VALUES (year(now()),DATE(NOW()),time(now()),NOW(),NOW());# 指定日期或时间插入INSERT INTO t_date ( `year_col`, `date_col`, `time_col`, `dt_col`, `create_time` )VALUES  ( 2020, '2020-06-03', '09:00:00', '2020-06-03 10:04:04', '2020-06-03 10:04:04' ),  ( 2020, '2020-05-10', '18:00:00', '2020-05-10 16:00:00', '2020-05-10 16:00:00' ),  ( 2019, '2019-10-03', '16:04:04', '2019-10-03 16:00:00', '2019-10-03 16:00:00' ),  ( 2018, '2018-06-03', '16:04:04', '2018-06-03 16:00:00', '2018-06-03 16:00:00' ),  ( 2000, '2000-06-03', '16:04:04', '2000-06-03 08:00:00', '2000-06-03 08:00:00' ),  ( 2008, '2008-06-03', '16:04:04', '2008-06-03 08:00:00', '2008-06-03 08:00:00' ),  ( 1980, '1980-06-03', '16:04:04', '1980-06-03 08:00:00', '1980-06-03 08:00:00' );

根据日期或时间等值查询

select * from t_date where year_col = 2020;select * from t_date where date_col = '2020-06-03';select * from t_date where dt_col = '2020-06-03 16:04:04';
select * from t_date where date_col > '2018-01-01';select * from t_date where dt_col >= '2020-05-01 00:00:00' and dt_col < '2020-05-31 23:59:59';select * from t_date where dt_col between '2020-05-01 00:00:00' and '2020-05-31 23:59:59';
# 查询create_time在本月的数据select * from t_date where DATE_FORMAT(create_time, '%Y-%m' ) = DATE_FORMAT( CURDATE( ) , '%Y-%m' );
# 以date_col为条件 查询最近7天或30天的数据SELECT * FROM t_date where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(date_col);SELECT * FROM t_date where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(date_col);
# 查询今天的数据SELECT * FROM t_date WHERE TO_DAYS(create_time) = TO_DAYS(NOW());# 查询某个月的数据SELECT * FROM t_date WHERE DATE_FORMAT(create_time, '%Y-%m')='2020-06';# 查询某年的数据SELECT * FROM t_date WHERE DATE_FORMAT(create_time, '%Y')= 2020;SELECT * FROM t_date WHERE YEAR(create_time) = 2020;# 根据日期区间查询数据,并排序SELECT * FROM t_date WHERE DATE_FORMAT(create_time, '%Y') BETWEEN '2018' AND '2020' ORDER BY create_time DESC;

本篇文章从日期和时间字段讲起,接着讲述了相关函数的使用方法,最后列举出一些常用的查询方法。希望这些内容对你有所帮助。真实情况下,某些查询可能更加复杂,特别是数据量很大时,根据时间字段查询往往会速度很慢,这时也要注意创建索引,最好能把时间字段转换为时间戳,因为整型的查询和筛选会快些。最好也要做个提醒,不要在日期和时间字段上做运算,程序能完成的事情不要在数据库层面来做。

更多相关文章

  1. 修改android系统和watchdog的延时
  2. Android(安卓)Calendar使用过程中遇到的问题
  3. Android执行shell命令
  4. DatePicker 日期选择控件 DatePickerDialog 日期选择对话框
  5. android 日期对话框
  6. Android中的AlarmManager的使用
  7. android calendar的使用
  8. android获得系统时间(Handler)
  9. Android简易闹钟实现

随机推荐

  1. c语言六种基本语句是什么
  2. c语言strcmp函数用法是什么?
  3. 学习c语言用什么软件
  4. c语言用什么函数来比较字符串大小?
  5. system()函数是什么
  6. c语言六种基本语句是哪些?
  7. c语言函数由哪两部分组成
  8. c语言在gcc中怎么运行程序?
  9. c语言的源程序不必通过编译就可以执行对
  10. fgetc函数的作用详解