mysql时间处理的问题
每天一个小问题,今天的问题是这样,在我们开发过程中,会遇到这样的需求,就是得到数据库中,今年的,去年的,本月的,上个月的,或者今天的,昨天的记录,这时候我们一般会有一个创建时间字段去匹配,比如我这里字段如下:
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
这里我们假设表是 student表,首先我们来解释一下DATE_FORMAT()函数和DATE_SUB()函数
DATE_FORMAT就是日期格式化,至于DATE_SUB是从日期减去指定的时间间隔,语法:
DATE_SUB(date,INTERVAL expr type)
- date: 合法的日期表达式
- INTERVAL: 语法固定写法
- expr: 间隔时间
- type: 时间类型
下面是对应的sql:
//今日
SELECT
*
FROM
student
WHERE
DATE_FORMAT(create_time, '%Y-%m-%d') = DATE_FORMAT(CURRENT_DATE(), '%Y-%m-%d')
//昨日
SELECT
*
FROM
student
WHERE
DATE_FORMAT(create_time, '%Y-%m-%d') = DATE_FORMAT(DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY), '%Y-%m-%d')
//本月
SELECT
*
FROM
student
WHERE
DATE_FORMAT(create_time, '%Y-%m') = DATE_FORMAT(create_time, '%Y-%m') = DATE_FORMAT(CURRENT_DATE(), '%Y-%m')
//上个月
SELECT
*
FROM
student
WHERE
DATE_FORMAT(create_time, '%Y-%m') = DATE_FORMAT(DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH), '%Y-%m')
//今年
SELECT
*
FROM
student
WHERE
DATE_FORMAT(create_time, '%Y') = DATE_FORMAT(CURRENT_DATE(), '%Y')
//去年
SELECT
*
FROM
student
WHERE DATE_FORMAT(create_time, '%Y') =
DATE_FORMAT(DATE_SUB(CURRENT_DATE(), INTERVAL 1 YEAR), '%Y')
这里我们测试都通过了,不过如果我们改成这样的写法是取不到去年12月的数据的,
SELECT DATE_FORMAT(DATE_SUB(CURRENT_DATE(), INTERVAL MONTH(CURRENT_DATE()) - 1 MONTH), '%Y-%m')
同理可知,这种写法不适合拿到上个月月底是昨天或者去年年底是上个月,千万注意了!!!
补充一下本周和上周的,还有本季度和上季度的
//本周
select * from student where DATE_FORMAT(create_time, '%Y-%u') = DATE_FORMAT(CURRENT_DATE(), '%Y-%u')
//上周
SELECT * FROM studen
WHERE DATE_FORMAT(create_time, '%Y-%u') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 WEEK), '%Y-%u')
//还有本季度
SELECT
*
FROM
student
WHERE
QUARTER(create_time) = QUARTER(CURDATE()) and YEAR(create_time) = YEAR(CURDATE())
//上季度
SELECT
*
FROM
student
WHERE
QUARTER(create_time) = QUARTER(DATE_SUB(CURDATE(),1 QUARTER)) and YEAR(create_time) = YEAR(CURDATE())