2011-08-24 134 views
3

我想創建一個SQL語句,以便以後在我的代碼中使用,它獲取當前月份的日期範圍。獲取當前月份的日期範圍?

示例:這是八月,所以日期範圍將是

StartDate = 08/01/11 
EndDate = 08/31/11 

但是,如果它是2月

StartDate = 02/01/11 
EndDate = 02/28/11 

Select * 
from mytable 
where (check_date >= StartDate) AND (check_date <= EndDate) 

感謝您可以給任何幫助

+1

使用本月最後一天的一個問題是您需要確保'check_date'永遠不會晚於12點發生。如果可以的話,最好使用'check_date dotjoe

+3

@dotjoe - 我同意。我可以寫一篇白皮書,說明爲什麼要使用排他性的結束日期而不是包含結束日期。在這種情況下,最終會出現'> = 8月1日和<9月1日這樣做更容易......(注意:使用這種格式意味着如果該字段始終是DATE或者它可以是一個DATETIME,它可以在任何情況下工作...) – MatBailie

回答

11

你可以找到本月開始的月份爲零的技巧。這個月的最後一天,是一個月以後,減一天:

select dateadd(month,datediff(month,0,getdate()),0) 
,  dateadd(day,-1,dateadd(month,datediff(month,-1,getdate()),0)) 

此打印:

1-aug-2011 31-aug-2011 
+0

它確實打印日期爲2011-08-01 00:00:00:00,但日期可以轉換爲任何想要的格式。 – Taryn

0

如果您需要每月範圍只是爲了檢查是否「check_date」屬於一個特定的月份,你也許可以像使用

month(Check_date) = @Month and year(Check_date) = @Year 
+0

雖然更簡單/更短,但這確實意味着您得到表掃描而不是索引查找(不是SARGable)。在被搜索領域執行操作通常會破壞這種性能。 (Short Code!= Efficient Code) – MatBailie

0

的情況您可以創建一個返回給定日期的結束日期的功能。

因此函數可以傳遞的開始日期,這將是這樣

WHEN(MONTH(@date) IN (1, 3, 5, 7, 8, 10, 12)) THEN 31 
WHEN(MONTH(@date) IN (4, 6, 9, 11)) THEN 30 
ELSE 
    CASE 
     WHEN (YEAR(@date) % 4 = 0 
     AND YEAR(@date) % 100 != 0) 
     OR (YEAR(@date) % 400 = 0) 
     THEN 29 
     ELSE 28 
END 
+3

我強烈建議不要執行這些日期規則,依賴於已經實現的日期函數。 – MatBailie

+0

+1爲什麼信任圖書館,當你可以自己做? xD – Andomar

+0

不知道關於不同日曆的庫支持,但這隻適用於(公式化)格里曆日曆。如果您的數據恰好適用於某些區域日曆(或甚至只是Julian),則這將不會按預期工作。 –

1

我需要非常類似的事情,從具體的日期,這是可能的SQL搜索中使用獲得一個月的日期範圍 - 這意味着不僅日期必須正確,而且如果在24小時系統中,時間必須從00:00:00到23:59:59,但它只是顯示DATETIME格式,它也可以在12小時系統上工作。

也許它會對某人有用。該解決方案基於Andomar的回答是:

-- Parameter date, which must be given to this code 
DECLARE @date DATETIME 
SET @date = GETDATE() -- for testing purposes initializing some date 

-- Declare @from and to date range variables 
DECLARE @from DATETIME 
DECLARE @to DATETIME 

-- This code line is based on Andomar's answer 
SET @from = DATEADD(month,DATEDIFF(month, 0, @date),0) 

-- Just simply to variable @from adds 1 month, minus 1 second 
SET @to = DATEADD(second, -1, DATEADD(month, 1, @date)) 

-- Result 
SELECT @from, @to 

您將獲得類似結果2012年1月1日00:00:00 - 2012.01.31 23:59:59

相關問題