美好的一天每个人目前我正在使用此代码来获取特定月份的数据
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中的新功能,这就是为什么我不知道工作的原因以及编码的好坏..
谢谢你:)
答案 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)