2012-05-10 42 views
3

使用Microsoft SQL 2008.我有兩個表,我想從當前日期到當月的第一天(或同一個月內)選擇, 。假設今天的日期是05/09/2012,日期列是'datecolumn'。從下表中我應該只從table1獲得行集6,7,從表2獲得行集9,2,因爲這些日期與05/09/2012在同一個月內。從當天到當月的第一天的兩個表中選擇日期範圍

table1 
4 02/01/2012 
5 01/02/2011 
6 05/01/2012 
7 05/20/2012 

table2 
8 02/01/2012 
9 05/14/2012 
3 01/02/2011 
2 05/18/2012 

我試過,但它沒有工作:

DECLARE @daterange 
SET @daterange = (DATEPART(MONTH,GETDATE()) + '/' + DATEPART(YEAR,GETDATE())) 

SELECT blah from table where (DATEPART(MONTH,datecolumn) + '/' + DATEPART(YEAR,datecolumn)) = @daterange 
+0

如果在table2上有第10行,日期爲5/15/2012 。輸出是什麼? –

+0

事實上,如果是這種情況(匹配當月的所有記錄),則不需要在標題中指示範圍 –

+0

該表格僅會生成另一個存儲過程運行當天的日期。不會有未來的日子。對不起,如果我困惑任何人。我試圖確保返回的行數在當月的範圍內,並且不超過查詢執行當天的第一個月或最後一個月。 – Patriotec

回答

1

你可以把它簡化,無需從GETDATE()重組日期字段:

SELECT blah 
FROM table 
WHERE DATEPART(MONTH,datecolumn) = DATEPART(MONTH,getdate()) AND 
DATEPART(YEAR,datecolumn) = DATEPART(YEAR,getdate()) 
+0

你和Andriy在查詢的性能上沒有差異。真棒。謝謝。 – Patriotec

0

如何確定開始和並選擇它們之間的記錄:

declare @monthBeginning datetime 
set @monthBeginning = (select dateadd(dd,-(day(dateadd(mm,1,getdate()))-1),dateadd(mm,0,getdate())) 

declare @monthEnd datetime 
set @monthEnd = (select dateadd(dd, -day(dateadd(m,1,getdate())), dateadd(m,1,getdate()))) 

select * 
from dateTable 
where datecolumn between @monthBeginning and @monthEnd 

如果你發現自己使用月開始和結束的計算很多,我建議把它們放入標量函數 - 邏輯足夠複雜,不想重複它。

+0

您忘記將變量名稱放入您的賦值語句中。無論如何,這似乎有點過於複雜,你可能需要對時間部分進行一些處理(即將它們重置爲00:00)。 –

0

您可以收到第一當月的是這樣的:

DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) 

以一個月爲增加了上述結果,您會收到第一下個月:

DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0) 

使用這兩個日期,您可以像這樣檢索所需的行:

SELECT 
    … 
FROM table1 
WHERE date >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) , 0) 
    AND date < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0) 
+0

感謝您的幫助。您和hkf在SQL統計數據上的表現相同。你的代碼很棒,因爲它適用於運行平衡(即3個月,6個月的範圍)。再次感謝。 – Patriotec

相關問題