0

有 2 个参数@yr,并且@period,@period只是月份数,因此例如 7 月将等于 7。

在我的存储过程表中,我有一个名为的列Date,它只是一个标准datetime字段。我需要一个where子句来计算所有大于当前期间减去 1 年的日期,所以如果@period = 7 and @yr = 2012我希望该where子句返回大于“01-07-2011”(英国日期格式)的所有日期,我如何仅使用 2来自@period和的数字@yr

WHERE <br>
Date >= '01-07-2011'
4

6 回答 6

3

你可以

Date >= dateadd(month, @period-1, dateadd(year, @yr-1900, 0))
于 2012-09-11T14:03:45.813 回答
2
where year(date)>year(getdate()-1) and month(date)>@period
于 2012-09-11T14:00:03.800 回答
2

如果您想要表达式sargable,请将其转换为日期时间:

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)
于 2012-09-11T14:01:05.263 回答
1

为了获得最佳性能,您应该执行以下操作:

declare @yr int = 2012
declare @period int = 7

select ...
from ....
WHERE date >= dateadd(month, (@yr - 1901) * 12 + @period - 1, 0)
于 2012-09-11T14:07:14.813 回答
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 以计算一年期结束日期

于 2012-09-11T14:08:35.717 回答
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)
于 2012-09-11T14:14:22.193 回答