背景:在开发过程中,我们经常需要根据时间作为判断条件来查询数据,例如:当月,当日,当前小时,几天内......

1. 当月

我们只需要使用一个mysql的MONTH(date)函数即可实现。(注意判断年份)

MONTH(date);
-- 用法:MONTH函数返回一个整数,表示指定日期值的月份。

-- 举例
SELECT MONTH('2020-11-11 00:00:00')
-- 返回值是11

2. 30天内

之所以把“30天内”放在当月的后面,是因为我经常会遇到这两个需求相互转换的情况,“30天内”也可以称作“一个月内”。

这种情况我们需要使用DATEDIFF(expr1,expr2)函数。

DATEDIFF(expr1,expr2)
-- 用法:参数为两个日期,返回的是expr1-expr2的天数差

-- 举例
SELECT DATEDIFF('2020-11-01 08:00:00','2020-11-11 00:00:00')
-- 返回值是-10

3. 当日

当日需要使用TO_DAYS(date)函数。

TO_DAYS(date)
-- 用法:返回从0000年(公元1年)至当前日期的总天数。

-- 举例
SELECT TO_DAYS('0000-01-01')
-- 返回值是1
SELECT TO_DAYS('0001-01-01')
-- 返回值是366

4. 当前小时

这种情况需要HOUR(date)和CURDATE()函数配合使用。

HOUR(date)
-- 用法:返回当前时间是今日的第几个小时
-- 举例
SELECT HOUR('2020-11-11 11:11:11')
-- 返回值是11

CURDATE()
-- 用法:返回今日的日期,不包括时分秒, yyyy-MM-dd

-- 使用举例
select * from table where created_at > CURDATE() and HOUR(created_at) = HOUR(now())

5. x天内

可以使用DATE_SUB(date,INTERVAL expr unit)函数来实现。

DATE_SUB(date,INTERVAL expr unit)
-- 用法:起始日期date 减去一个时间段后的日期

后面的单位unit有很多值可以选择,如下表:

类型(unit值) 含义 expr表达式的形式
YEAR YY
MONTH MM
DAY DD
HOUR hh
MINUTE mm
SECOND ss
YEAR_MONTH 年和月 YY和MM之间用任意符号隔开
DAY_HOUR 日和小时 DD和hh之间用任意符号隔开
DAY_MINUTE 日和分钟 DD和mm之间用任意符号隔开
DAY_SECOND 日和秒钟 DD和ss之间用任意符号隔开
HOUR_MINUTE 时和分 hh和mm之间用任意符号隔开
HOUR_SECOND 时和秒 hh和ss之间用任意符号隔开
MINUTE_SECOND 分和秒 mm和ss之间用任意符号隔开

-- 举例
-- 七天内的数据查询
select * from table where created_at > DATE_SUB(CURDATE(),INTERVAL 7 DAY)

6. 多少天内数据统计

我们经常还会遇到这种需求,统计7天内每天数据的量。这种情况下,我们需要考虑没有数据推送的情况,即为0也要得到。

我的思路如下:

SELECT DATE_SUB( CURDATE(), INTERVAL m.s day ) AS orderDateFROM(  SELECT 0 as s UNION ALL  SELECT 1 UNION ALL  SELECT 2 UNION ALL  SELECT 3 UNION ALL  SELECT 4 UNION ALL  SELECT 5 UNION ALL  SELECT 6 ) m
-- 举例:查询12个月内每个月数据的数量SELECT COUNT(t.created_at),res.date FROM (SELECT DATE_FORMAT(DATE_SUB( CURDATE(), INTERVAL m.s MONTH ),'%Y-%m') AS dateFROM(  SELECT 0 as s UNION ALL  SELECT 1 UNION ALL  SELECT 2 UNION ALL  SELECT 3 UNION ALL  SELECT 4 UNION ALL  SELECT 5 UNION ALL  SELECT 6 UNION ALL  SELECT 7 UNION ALL  SELECT 8 UNION ALL  SELECT 9 UNION ALL  SELECT 10 UNION ALL  SELECT 11 ) m)resleft join table t on res.date = DATE_FORMAT(t.created_at,'%Y-%m')GROUP BY date

更多相关文章

  1. 如何使用Android(安卓)Studio开发/调试Android自带系统应用
  2. Android如何使用so文件和Android(安卓)studio中导入so
  3. android之CheckBox
  4. android 如何使用android:supportsRtl属性
  5. 如何搭建android的开发环境 虚拟机和ubuntu的安装与建立编译条件
  6. Android(安卓)如何使用log4j及注意事项
  7. 如何使用QuickContactBadge
  8. Android(安卓)如何使用internal 和 hidden API
  9. Android中如何使用Intent在Activity之间传递对象[使用Serializab

随机推荐

  1. 惊呆了!不改一行 Java 代码竟然就能轻松解
  2. 设置id从1开始自增
  3. zdz工具箱v1.5 android版本发布了,集成各
  4. 什么是Azure Backup
  5. 牛逼 IDE 插件,一键部署 Docker 镜像,开发
  6. 芋道 Spring Cloud Alibaba 介绍
  7. 芋道 Spring Boot 快速入门
  8. 阿里云也有 IDEA 插件 Cloud Toolkit
  9. 芋道 Spring Cloud Alibaba 注册中心 Nac
  10. pytest测试入门篇(ExitCode退出码)