Dengan referensi pertanyaan ini, saya perlu fungsi di mana saya akan memberikan dua tanggal dan akan menceritakan interval hari, bulan atau tahun dan itu akan menghasilkan seri waktu seperti kami memiliki fungsi ...

0
Billz 5 April 2021, 22:07

1 menjawab

Jawaban Terbaik

Coba CTE rekursif yang memanfaatkan pernyataan kasus yang menerjemahkan jenis interval Anda ke entri interval yang sesuai untuk fungsi DateAdd:

declare 
    @interval varchar(50) = 'month',
    @startDate datetime = '2021-01-01',
    @endDate datetime = '2022-04-15';

with base as (

    select      dt = @startDate

    union all
    select      dt = ap.nextDt
    from        base 
    cross apply (select nextDt = 
                    case 
                    when @interval in ('year', 'yy', 'yyyy') then DATEADD(year, 1, dt)
                    when @interval in ('quarter', 'qq', 'q') then DATEADD(quarter, 1, dt)
                    when @interval in ('month', 'mm', 'm') then DATEADD(month, 1, dt)
                    when @interval in ('dayofyear', 'dy', 'y') then DATEADD(dayofyear, 1, dt)
                    when @interval in ('day', 'dd', 'd') then DATEADD(day, 1, dt)
                    when @interval in ('week', 'wk', 'ww') then DATEADD(week, 1, dt)
                    when @interval in ('weekday', 'dw', 'w') then DATEADD(weekday, 1, dt)
                    when @interval in ('hour', 'hh') then DATEADD(hour, 1, dt)
                    when @interval in ('minute', 'mi', 'n') then DATEADD(minute, 1, dt)
                    when @interval in ('second', 'ss', 's') then DATEADD(second, 1, dt)
                    when @interval in ('millisecond', 'ms') then DATEADD(millisecond, 1, dt)
                    else @endDate 
                    end 
                ) ap
    where       ap.nextDt <= @endDate

)

select      *
from        base 

Dengan parameter @interval diatur ke kenaikan berdasarkan bulan, ini kembali:

+-----------------------+
|dt                     |
+-----------------------+
|2021-01-01 00:00:00.000|
|2021-02-01 00:00:00.000|
|2021-03-01 00:00:00.000|
|2021-04-01 00:00:00.000|
|2021-05-01 00:00:00.000|
|2021-06-01 00:00:00.000|
|2021-07-01 00:00:00.000|
|2021-08-01 00:00:00.000|
|2021-09-01 00:00:00.000|
|2021-10-01 00:00:00.000|
|2021-11-01 00:00:00.000|
|2021-12-01 00:00:00.000|
|2022-01-01 00:00:00.000|
|2022-02-01 00:00:00.000|
|2022-03-01 00:00:00.000|
|2022-04-01 00:00:00.000|
+-----------------------+
2
Daniel Gimenez 5 April 2021, 20:01