从一个月的数字SQL中计算出一个日期

时间:2012-09-11 13:57:18

标签: sql sql-server sql-server-2008 tsql date

得到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'

6 个答案:

答案 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)