Year()函数和Month()函数

时间:2013-09-19 02:40:07

标签: sql tsql datetime sql-server-2008-r2 comparison

美好的一天每个人目前我正在使用此代码来获取特定月份的数据

     SELECT * from Table1  d
where
MONTH(d.fld_ExpiryDate)=@month 
     AND  YEAR(d.fld_ExpiryDate)=@year 

我的一些同事告诉我使用持续时间,例如。

d.fld_LoanDate >= '2009-11-01' and
d.fld_LoanDate < '2009-12-01'

问题是使用范围会更好吗?我将如何计算月份的开始和下个月的开始?如果用户只输入@month int and @year int?

任何帮助都会非常感谢我在tsql中的新功能,这就是为什么我不知道工作的原因以及编码的好坏..

谢谢你:)

2 个答案:

答案 0 :(得分:1)

如果fld_LoanDate上有索引,则范围会更好。围绕mont()year()函数的函数往往会妨碍索引的使用。

答案 1 :(得分:1)

我希望这适用于您的语言环境。它会创建一个类似“1/9/2013”​​的字符串并将其转换为日期时间。您可以更改它并构建一个您的区域约定字符串:

declare @y int=2013
,@m int=9
,@lower datetime
,@upper datetime

set @lower=convert(datetime,'1/'+CONVERT(varchar(2),@m)+'/'+CONVERT(varchar(4),@y))
print @lower
set @upper=DATEADD(m,1,@lower)
print @upper

这使用dateadd并且可能更好,但不太透明:

declare @y int=2013
,@m int=9
,@lower datetime
,@upper datetime

select @lower=DATEADD(mm,@m-1,DATEADD(YY,@y-1900,0))
print @lower
select @upper=DATEADD(m,1,@lower)
print @upper

(在sql server 2012上你会有DATETIMEFROMPARTS