DateAdd with column的缩写

时间:2013-09-04 21:12:25

标签: sql sql-server

我有以下SQL来增加MOCKTABLE结果中每行的开始时间。

SELECT
    DATEADD( "d", ROW_NUMBER() OVER (ORDER BY mt.ID), mt.StartTime ) AS INCREMENT
FROM
    MOCKTABLE mt

现在我想将“d”换成MOCKTABLE中指定的列。像这样:

SELECT
    DATEADD( mt.PeriodTime, ROW_NUMBER() OVER (ORDER BY mt.ID), mt.StartTime ) AS INCREMENT
FROM
    MOCKTABLE mt

我该怎么做? PeriodTime列是nvarchar(5),包含'd','ww'或'm'。我想要的原因是因为用户应该决定原始日期的增量。

3 个答案:

答案 0 :(得分:3)

你可以用大案例陈述来做到这一点:

SELECT (case when PeriodTime = 'day'
             then DATEADD(day, ROW_NUMBER() OVER (ORDER BY mt.ID), mt.StartTime)
             when PeriodTime = 'month'
             then DATEADD(month, ROW_NUMBER() OVER (ORDER BY mt.ID), mt.StartTime)
             when PeriodTime = 'year'
             then DATEADD(year, ROW_NUMBER() OVER (ORDER BY mt.ID), mt.StartTime)
        end) AS INCREMENT
FROM MOCKTABLE mt

答案 1 :(得分:2)

如果你不需要几年或几个月,那么而不是PeriodTime是一个字符串,它可能是一个int

例如,如果您想要的最小增量是一小时。

,1,24,168会给你一小时,一天和一周
DateAdd(hour,PeriodTime * ROW_Number(),Somedate)
没有巨大而恼人的案例陈述。

答案 2 :(得分:0)

快速回答是你无法做到这一点

select datepart(day, getdate()) -- this works
select datepart('day', getdate()) -- this throws the following error

Msg 1023, Level 15, State 3, Line 1
Invalid parameter 1 specified for datepart.

我可以做这样的事情

select case 
  when mt.PeriodTime 'day' then datapart(day,getdate())
  when mt.PeriodTime 'hour' then datapart(hour,getdate())
  ...
end

DateAdd的工作方式相同。

- 看起来我在34秒内输掉了答案。