【发布时间】:2012-05-05 02:04:14
【问题描述】:
我有一个mysql-db,里面有费用,有一个日期时间。每个月我都想创建一张包含上个月或更早的所有费用的发票。因此,如果是 2012 年 2 月 2 日、5 日或 30 日,我仍然只想要 2012 年 4 月或更早的发票。我试过使用 date_sub,但它只是减去一个月,所以它只在上个月的同一天开具发票。我该怎么做?
从广告中获取 * WHERE AdEnd > ??
泰!
【问题讨论】:
我有一个mysql-db,里面有费用,有一个日期时间。每个月我都想创建一张包含上个月或更早的所有费用的发票。因此,如果是 2012 年 2 月 2 日、5 日或 30 日,我仍然只想要 2012 年 4 月或更早的发票。我试过使用 date_sub,但它只是减去一个月,所以它只在上个月的同一天开具发票。我该怎么做?
从广告中获取 * WHERE AdEnd > ??
泰!
【问题讨论】:
我总是发现,如果你从当前日期中减去以天为单位的月份中的某一天,你将得到上个月的最后一天。例如,在每月 15 日,减去 15 天,您将得到上个月的最后一天:
SELECT (DATE_SUB(CURDATE(),INTERVAL DAYOFMONTH(CURDATE()) DAY))
如果CURDATE() 是2012-05-05,那么上面的返回2012-04-30。
因此,要将广告投放到上个月的最后一天,请执行以下操作:
SELECT *
FROM Ads
WHERE AdEnd <= (DATE_SUB(CURDATE(),INTERVAL DAYOFMONTH(CURDATE()) DAY))
如果 AdEnd 是 DATE,则此方法有效,但如果它是 DATETIME,您只需要执行 less than the first of the month,因此您减去一天即可获得每月的第一天,如下所示:
SELECT *
FROM Ads
WHERE AdEnd < (DATE_SUB(CURDATE(),INTERVAL DAYOFMONTH(CURDATE()) - 1 DAY))
【讨论】:
AdEnd 确实是 OP 所写的 DATETIME,则您需要执行类似于 ... WHERE AdEnd < DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE()) - 1 DAY) 的操作
试试date_diff,例如:
SELECT DATEDIFF('2008-11-30','2008-11-29') AS DiffDate
产量:
1
【讨论】: