2017-05-30 36 views
2

我有一個非常基本的查詢,我每月運行一次。每個月我都必須手動更改查詢以適應當前的月份開始和結束日期。我試過使用以前答案中的一些例子,但似乎無法使其工作。值得注意的是,因爲我試圖包含整個月的最後一天,如我的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

哪個sql數據庫? – maSTAShuFu

回答

0

三件事:

第一:日期看起來像2017-05-015/1/2017在大多數DBMS表示。

第二:你想要這種表達式(注意<),以確保你得到所有的行。這是比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(線索如果我是一個富有的人屋頂上的提琴手TRUNC(SYSDATE, 'MM')給你第一個月,所以這得到上個月的行。

where dateCreate >= ADD_MONTHS(-1, TRUNC(SYSDATE, 'MM')) 
    and dateCreate < TRUNC(SYSDATE, 'MM') 
+0

我真的很感謝你的迴應!我正在使用Microsoft SQL。我很抱歉沒有提及,我一直認爲如果我沒有指定MySQL(這是Linux,對吧?)MS SQL是默認的。我對數據庫瞭解不多,所以我很欣賞這些信息。我一定會在將來指定:) – user3010456

+0

如果您在答案解決您的問題時選中綠色複選框,對社區有幫助。 MySQL和Oracle都可以在Windows/Linux/FreeBSD上運行。 MySQL也在Mac上運行。 Microsoft SQL Server僅在Windows上運行(它們具有Linux版本的原型)。 –

0

你其實可以做的就是讓月份和年份

SELECT * 
FROM WorkOrder 
where active = 1 and 
WorkOrderStatusId in (6,8) AND 
year(dateCreated) = 2017 
month(dateCreated) = 5 
相關問題