我有一个非常基本的查询,我每月运行。每个月我都必须手动更改查询以适应当前月份的开始和结束日期。我已尝试使用之前答案中的一些示例,但似乎无法使其正常工作。值得注意的是,因为我试图包括该月的整个最后一天,如我的23:59:59参数所示。实现这一目标的最佳方法是什么?
SELECT *
FROM WorkOrder
where active = 1 and
WorkOrderStatusId in (6,8) AND
dateCreated >= '5/1/2017' and
dateCreated <= '5/31/2017 23:59:59'
答案 0 :(得分:0)
你实际可以做的是获得月份和年份
SELECT *
FROM WorkOrder
where active = 1 and
WorkOrderStatusId in (6,8) AND
year(dateCreated) = 2017
month(dateCreated) = 5
答案 1 :(得分:0)
三件事:
首先:在大多数DBMS表示中,日期看起来像2017-05-01
而不是5/1/2017
。
第二:你想要这种表达式(注意<
)以确保获得所有行。这是一种比23:59:59
更好的方法。
where dateCreated >= '2017-05-01'
and dateCreated < '2017-06-01'
第三,你可能想要一种说法
where dateCreated >= first_day_of_last_month
and dateCreated < first_day_of_this_month
以不必每个月更改查询的方式。
这在数据库服务器的不同品牌和型号中的工作方式不同。你没告诉我们你正在使用哪一个,所以......
在MS SQL Server中,DATEADD(DAY, 1-DATEPART(DAY, GETDATE()), GETDATE())
为您提供当月的第一个,所以
where dateCreate >=
DATEADD(MONTH, -1, DATEADD(DAY, 1-DATEPART(DAY, GETDATE()), GETDATE()))
and dateCreate <
DATEADD(DAY, 1-DATEPART(DAY, GETDATE()), GETDATE())
在MySQL中,DATE_FORMAT(CURDATE(), '%Y-%m-01')
会在当月的第一天给你午夜,所以这个where
子句会获得上个月的行。
where dateCreated >= DATE_FORMAT(CURDATE(), '%Y-%m-01') - INTERVAL 1 MONTH
and dateCreated < DATE_FORMAT(CURDATE(), '%Y-%m-01')
在Oracle中(cue 如果我是一个富翁来自屋顶上的Fiddler )TRUNC(SYSDATE, 'MM')
为您提供了本月的第一个,所以这是最后一次月份行。
where dateCreate >= ADD_MONTHS(-1, TRUNC(SYSDATE, 'MM'))
and dateCreate < TRUNC(SYSDATE, 'MM')