有一種更快的方式做到這一點:
DECLARE @minDate DATE
DECLARE @maxDate DATE
SET @minDate = XXXXX
SET @maxDate = YYYYY
-- Get the first day of the month minDate.
SET @minDate = CONVERT(datetime,CONVERT(varchar(6),@minDate,112)+'01',112)
-- Get the last day of the month minDate.
SET @maxDate = CONVERT(datetime,CONVERT(varchar(6),@maxDate,112)+'01',112)
SET @maxDate = DATEADD(day, -1, DATEADD(month, 1, @maxDate))
SELECT * FROM myTABLE WHERE DateCol >= @minDate AND DateCol <= @maxDate
或者:
SELECT * FROM myTABLE
WHERE DateCol >= CONVERT(datetime,CONVERT(varchar(6),XXXXX,112)+'01',112)
AND DateCol <= DATEADD(day, -1, DATEADD(month, 1, CONVERT(datetime,CONVERT(varchar(6),YYYYY,112)+'01',112)))
對於XXXXX和YYYYY而不是「2017-09-30」,使用類似CONVERT(datetime,'20170930',112)或CONVERT(datetime,'09 -30-2017',110)的語法,但使用SQL Server隱式從char到datetime轉換(依靠服務器配置:可能有危險!!!))。
使用此語法更快,因爲@minDate和@maxDate不需要任何評估。這樣的索引,可以直接使用...
否則的標量函數將模擬EOMONTH()的行爲可能是有用的...
'其中DATE_1> = '20161101' 和DATE_1 <=「20170930'' - 唯一真正安全的格式在SQL Server中的日期/時間文字,至少對於'datetime'和'smalldatetime',是:'YYYYMMDD'和'YYYY-MM-DDThh:mm:ss [.nnn]' - [踢壞的習慣:錯誤處理日期/範圍查詢 - Aaron Bertrand](http ://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx) – SqlZim
https://blogs.msdn.microsoft.com/ samlester/2013/09/23/emonth-equivalent-in-sql-server-2008-r2-and-below/ – ttugates
@SqlZim,我沒有真正問過格式。年份和月份由用戶選擇。因此,如果他們選擇了2017年9月,您怎麼知道在「20170930」日期附加30? – user7733611