它使您的查詢優化搜索,使您的日期列的索引,可以使用很重要。因此,因爲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)))
)
希望有所幫助!
要獲得一個月的第一天,你可以用'DATEADD(月,DATEDIFF(每月,0,GETDATE()),0)'和下個月的第一天'DATEADD(月,1 + datediff(月,0,getdate()),0)'。 –