2012-06-11 76 views
0

列使用SQL Server 2000如何過濾日期

表1

Id date 
--- ---------- 
001 23/01/2012 
002 25/01/2012 
003 
004 01/02/2012 

table1,我想顯示id和日期爲空或日期等於當月..

條件

  • 例如當前月份是02/2012種手段,我想顯示的編號003和004,因爲003日爲空,004日期等於當前的月份日期...

  • 如果當前月份是03/2012,004日期應該不會顯示

如何做到這一點在SQL Server?

期望輸出

Id  date 
003 
004 01/02/2012 

回答

2

它使您的查詢優化搜索,使您的日期列的索引,可以使用很重要。因此,因爲SQL Server無法在日期使用索引where子句是表單功能(日期)(其中函數是年,月或日期部分)的是壞的。

而是要包圍着您的查詢,以便它的形式

select * 
from table1 
where (date is null) or (date between [STARTOFMONTH] and [ENDOFMONTH]) 

日期時間列具有的,顧名思義,時間分量。既然你想的權利,直到午夜在月底所以之間棘手,但並不完全午夜引領到下一個月。有些人試圖通過從月底減去3毫秒解決此破解。這是不好的,也不是未來的證明。

這是更好地使你的查詢看起來像

select * 
from table1 
where (date is null) or ((date >= [STARTOFMONTH] and date < [STARTOFNEXTMONTH])) 

如何獲得這些值(並SQL 2000兼容)? 一種方法,把我的頭頂部,是

cast( floor(cast(dateAdd(d, -1 * day(getDate()) + 1, getDate()) as float)) as datetime) 

,並以一個月爲增加所獲得的下一個月開始。這得到當前日期,減去當月逝去的天數,然後添加1.我們然後有一個日期/時間等於一個月的第一天,但​​仍然有時間成分。一個演員浮動,地板,然後回到日期時間修復。

這可以被放入一個標量或內聯表UDF,但在簡潔的利息(長的答案了!),你的where子句是

select * 
from table1 
where 
(date is null) 
OR 
(
    (date >= cast( floor(cast(dateAdd(d, -1 * day(getDate()) + 1, getDate()) as float)) as datetime)) 
    AND 
    (date < dateAdd(d, 1, cast( floor(cast(dateAdd(d, -1 * day(getDate()) + 1, getDate()) as float)) as datetime))) 
) 

希望有所幫助!

+0

要獲得一個月的第一天,你可以用'DATEADD(月,DATEDIFF(每月,0,GETDATE()),0)'和下個月的第一天'DATEADD(月,1 + datediff(月,0,getdate()),0)'。 –

0
Select * 
from table1 
where date is null or datepart(mm,getdate()) = datepart(mm,date) 
+0

如果您發佈的代碼,XML或數據樣本,**請**突出顯示文本編輯器的線和編輯器工具欄上的「代碼示例」按鈕('{}')點擊很好的格式和語法高亮它! –

0
SELECT * FROM Table1 
WHERE (1=1) 
AND 
(
    MONTH(CURRENT_TIMESTAMP) = MONTH([date]) 
    AND 
    YEAR(CURRENT_TIMESTAMP) = YEAR([date]) 
) 
OR 
(
    [date] IS NULL 
) 
0

你可以檢查使用爲空年,月功能

select Id 
from Table1 
where date is null or (YEAR(GETDATE()) == Year(date) and Month(GETDATE()) == Month(date)) 
0

試試這個方法: -

SELECT * 
FROM table1 
WHERE date IS NULL OR (Year(currentDate) = Year(date) AND Month(currentDate) = Month(date)) 
+0

它CURRENT_TIMESTAMP代替的currentdate –