0

我有以下 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”。我想要这个的原因是因为用户应该决定原始日期的增量。

4

3 回答 3

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
于 2013-09-04T21:29:20.587 回答
2

如果您不需要年或月,那么 PeriodTime 不是一个字符串,而是一个 int

例如,如果您想要做的最小增量是一个小时。1,24,168 会给你一个小时、一天和一周

DateAdd(hour,PeriodTime * ROW_Number(),Somedate)

没有庞大而恼人的案例陈述。

于 2013-09-04T21:39:41.170 回答
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 秒。

于 2013-09-04T21:29:55.073 回答