前言:

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

1.日期和时间类型概览

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

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

2.日期和时间相关函数

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

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

一些使用示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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 |

+------+------+

3.日期和时间字段的规范查询

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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' );

根据上面测试表的数据,我们来学习下几种常见查询语句的写法:

根据日期或时间等值查询

1

2

3

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';

根据日期或时间范围查询

1

2

3

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';

查询本月的数据

1

2

# 查询create_time在本月的数据

select * from t_date where DATE_FORMAT(create_time, '%Y-%m' ) = DATE_FORMAT( CURDATE( ) , '%Y-%m' );

查询最近多少天的数据

1

2

3

# 以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);

其他各类查询写法

1

2

3

4

5

6

7

8

9

# 查询今天的数据

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;

总结:

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

mysql如何查询日期与时间相关推荐

  1. mysql查询数据库日期_mysql如何查询日期与时间

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

  2. SQL查询日期和时间

    SQL查询日期和时间 日期和时间类型 日期和时间相关函数 日期和时间查询语句 日期和时间类型 MySQL(Mariadb)支持的日期和时间类型有 DATETIME.TIMESTAMP.DATE.TIM ...

  3. Mysql常见的日期、时间函数

    Mysql常见的日期.时间函数 一.日期(date)相关 二.时间(time)相关 三.日期和时间 四.日期与时间的比较及运算 五.日期和时间的格式化 一.日期(date)相关 CURDATE().C ...

  4. R语言使用lubridate包的tz函数设置和查询日期、时间对象的时区信息( time zone)

    R语言使用lubridate包的tz函数设置和查询日期.时间对象的时区信息( time zone) 目录

  5. MySQL中的日期和时间类型

    文章目录 1 MySQL中的日期和时间类型 1 MySQL中的日期和时间类型 日期与时间类型是为了方便在数据库中存储日期和时间而设计的,数据库有多种表示日期和时间的数据类型.其中,YEAR类型表示年, ...

  6. MySQL模糊查询日期时间的方法

    今天在写一个SSM项目时,其中需要到用模糊查询日期,之前没有用过 ,在网上翻阅一些资料查找到一些方法,特来跟大家分享下: Mysql模糊查询有以下三种方法: 1.Convert转成日期时间型,在用Li ...

  7. mysql返回指定时间格式_【MySQL】查询日期返回指定格式

    查询日期返回固定格式 SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS nowDate FROM table_name // 2020-09-25 2 ...

  8. Mysql中的日期与时间类型

    MySQL有多种表示日期和时间的数据类型,不同的版本可能有所差异,MySQL8.0版本支持的日期和时间类型主要有:YEAR类型.TIME类型.DATE类型.DATETIME类型和TIMESTAMP类型 ...

  9. mysql now str,数据库学习之MySQL (十)—— 日期和时间函数 NOW STR_TO_DATE DATE_FORMAT 流程控制函数 IF IFNULL CASE...

    MySQL学习专栏 正在持续更新中:) 文章目录 日期和时间函数 NOW STR_TO_DATE DATE_FORMAT 流程控制函数 IF IFNULL CASE 下章预告 日期和时间函数 NOW ...

最新文章

  1. 飞机大战html游戏全代码js、jquery操作
  2. 看不见的Unicode码让敏感词轻松逃过审核,谷歌IBM都中招
  3. pix2pix 学习笔记
  4. 代码生成工具之界面快速生成
  5. EFCore查缺补漏(二):查询
  6. Hazelcast入门指南第2部分
  7. PaperNotes(5)-Conditional Generative Adversarial Nets
  8. 20180326-1777-1.2-UMLDOC
  9. Qt界面语言设置(官方汉化)
  10. 详解JAVA对象实例化过程
  11. 女暴徒BeHype:MINT和Raffle抽奖规则及答疑
  12. 安卓刷机及刷机包制作教程
  13. Java代码解压rar文件
  14. uni-app 常用内容
  15. deepdive的股权关系抽取实践
  16. 英伟达Flex-unity插件
  17. 最近很火!一名移动互联网员工写给老婆的信
  18. php网站 域名授权 怎么破,使用php进行域名授权代码 - 小俊学习网
  19. 10亿个数中找出最大的10000个数(top K问题)
  20. 别人那里看来的,先记着,学习下,以后也许就用到了

热门文章

  1. 09_方法重写丶多态丶抽象类
  2. 【B站老杜】mysql详解
  3. matlab工业产值增长率,已知今年的工业产值为100万元,产值增长率为从键盘输入......
  4. VC++6.0使用MATCOM矩阵库的方法
  5. 计算机文档编辑ps知识,PS指导书_电脑基础知识_IT计算机_专业资料
  6. vue 回到页面顶部
  7. Tkinter 界面美化-- ttkbootstrap
  8. 适合网络攻城狮学习的Python——基本语法(字典)
  9. vue 写的登录页面
  10. 爱心代码 python(以烟花为背景)