有一种更快的方式做到这一点:
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