从当前月份动态声明开始/结束日期

时间:2017-05-30 22:45:08

标签: mysql sql sql-server oracle datetime

我有一个非常基本的查询,我每月运行。每个月我都必须手动更改查询以适应当前月份的开始和结束日期。我已尝试使用之前答案中的一些示例,但似乎无法使其正常工作。值得注意的是,因为我试图包括该月的整个最后一天,如我的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'

2 个答案:

答案 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')