我需要一些帮助。
我有以下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'
答案 0 :(得分:4)
尝试将DATE_SUB
与BETWEEN
:
SELECT *
FROM DATA_WH.SALESORD_HDR
WHERE ORDERDATE BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND
DATE_SUB(NOW(), INTERVAL 2 MONTH)
这避免了在使用MONTH
和YEAR
时必须处理边界条件的问题。
修改强>
上述查询将返回订单日期为一至两个月旧的记录。如果您想要识别上一个日历月的订单,那么您将需要做更多的工作。试试这个问题:
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日,截至撰写此答案时)。
这是一个小提琴,显示了这个逻辑:
答案 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()))))