0

Good Day Every one 目前我正在使用此代码获取特定月份的数据

     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 的新手,这就是为什么我不知道解决方法以及编码中有什么好或不好的原因。

谢谢你 :)

4

2 回答 2

1

如果 上有索引,则范围会更好fld_LoanDatemont()和函数周围的year()函数往往会阻碍索引的使用。

于 2013-09-19T02:41:39.563 回答
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

于 2013-09-19T12:11:13.680 回答