我有以下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'。我想要的原因是因为用户应该决定原始日期的增量。
答案 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秒内输掉了答案。