MySQL(现在() - 间隔1个月)仅适用于今年

时间:2016-09-13 04:11:45

标签: mysql

我需要一些帮助。

我有以下SQL语句

SELECT * FROM table 
WHERE MONTH(ORDERDATE) = MONTH(NOW() - INTERVAL 1 MONTH)

问题是它从上个月返回数据但是所有年份......我做错了什么或这是人们面对这个功能的正常问题?

我面临的问题是,如果我使用YEAR(NOW()),我写的报告将在2017年达到2017年时显示2016年的数据。我试图写下6个月的销售历史报告。

任何指导都将不胜感激。

添加信息

SELECT * FROM DATA_WH.SALESORD_HDR WHERE MONTH(ORDERDATE) = MONTH(NOW() - INTERVAL 1 MONTH)

... RETURNS

' 2015-08-14 00:00:00'

3 个答案:

答案 0 :(得分:4)

尝试将DATE_SUBBETWEEN

一起使用
SELECT *
FROM DATA_WH.SALESORD_HDR
WHERE ORDERDATE BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND
                        DATE_SUB(NOW(), INTERVAL 2 MONTH)

这避免了在使用MONTHYEAR时必须处理边界条件的问题。

修改

上述查询将返回订单日期为一至两个月的记录。如果您想要识别上一个日历的订单,那么您将需要做更多的工作。试试这个问题:

SELECT *
FROM DATA_WH.SALESORD_HDR
WHERE ORDERDATE >= STR_TO_DATE(CONCAT('01-', LPAD(MONTH(DATE_SUB(NOW(), INTERVAL 1 MONTH)), 2, '0'), '-', YEAR(DATE_SUB(NOW(), INTERVAL 1 MONTH))), '%d-%m-%Y') AND
      ORDERDATE <  STR_TO_DATE(CONCAT('01-', LPAD(MONTH(NOW()), 2, '0'), '-', YEAR(NOW())), '%d-%m-%Y')

此处的策略是使用ORDERDATE建立日期边界(2016年8月1日和9月1日,截至撰写此答案时)。

这是一个小提琴,显示了这个逻辑:

SQLFiddle

答案 1 :(得分:0)

我认为你必须使用AND和YEAR函数

添加另一个条件
SELECT * FROM DATA_WH.SALESORD_HDR WHERE MONTH(ORDERDATE) = MONTH(NOW() - INTERVAL 1 MONTH) AND YEAR(ORDERDATE)= YEAR(NOW());

答案 2 :(得分:0)

我最近一直在处理此类查询: 此查询将获取该月的第一天和该月的最后一天,此外,如果您可以仔细检查该查询,您应该能够看到我从 mysql 添加了一个函数,该函数检查该月的最后一天是否为“last_day” (现在())"

SELECT *
FROM DATA_WH.SALESORD_HDR
WHERE ORDERDATE BETWEEN  date(concat(year(now()) , '-' ,month(now()) , '-01')) ,AND
                        date(concat(year(now()) , '-' ,month(now()) , '-' , day(last_day(now()))))