得到2个参数@yr
和@period
,@period
只是月份数,所以7月等于7。
在我的存储过程表中,我有一个名为Date
的列,它只是一个标准datetime
字段。我需要一个where
子句来计算大于当前时间减去1年的所有日期,所以如果@period = 7 and @yr = 2012
我希望where
子句返回大于'01 -07-2011的所有日期'(英国日期格式)如何只使用@period
和@yr
中的2个数字来实现此目的。
WHERE <br>
Date >= '01-07-2011'
答案 0 :(得分:3)
你可以
Date >= dateadd(month, @period-1, dateadd(year, @yr-1900, 0))
答案 1 :(得分:2)
where year(date)>year(getdate()-1) and month(date)>@period
答案 2 :(得分:2)
如果您想要表达式sargable,请将其转换为datetime:
declare @year int = 2012
declare @month int = 7
select
...
where [Date] >= convert(datetime, convert(varchar(4), @year)
+ right('0' + convert (varchar(2), @month), 2)
+ '01')
在看到Alex K.的答案之后,你甚至可以这样做:
dateadd(month, @month - 1 + (@year-1900) * 12, 0)
答案 3 :(得分:1)
为了获得最佳性能,您应该执行以下操作:
declare @yr int = 2012
declare @period int = 7
select ...
from ....
WHERE date >= dateadd(month, (@yr - 1901) * 12 + @period - 1, 0)
答案 4 :(得分:0)
请确保您与整个日期进行比较,我提供的解决方案之一是:
Select *
from TheTable
where date> DateAdd(Year,-1, convert(datetime, '01/'+convert(varchar,@period)+'/' + convert(varchar,@yr)))
考虑SQL Server 2012中的区域格式差异:
Select *
from TheTable
where date> DateAdd(Year,-1, DateFromParts(@year,@period,1))
2012年之前:
Select *
from TheTable
Where Date > DateAdd(day, 0, DateAdd(month, @period-1, DateAdd(year, (@yr-1900)-1,0)))
维持@ yr-1900以说明基准日期偏离1900的计算,然后减去1的一年假日计算
答案 5 :(得分:0)
我们可以通过各种方式实现
试试吧
DECLARE @a VARCHAR(20),
@b VARCHAR(10),
@c varchar(4)
SET @b='may' /*pass your stored proc value */
SET @c='2011'
SET @a='01'+@b+@c
SET DATEFORMAT YDM
SELECT CAST(@a AS DATE)
FOR uk formate
SELECT CONVERT(char,CAST(@a AS DATE),103)