0

MOCKTABLE の結果の各行の開始時間を増やす次の SQL があります。

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

大きな case ステートメントでそれを行うことができます:

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 時間であった場合。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 に答える