sql >> データベース >  >> RDS >> Sqlserver

間違って計算された2日間の週数と部分週

    DATEDIFF 遷移をカウントします 、ピリオドではありません(例:DATEDIFF(year,'20161231','20170101') )。また、日曜日を週の最初の日として扱います。では、これらの機能をどのように補正するのでしょうか。まず、月曜日が新しい日曜日になるように日付をシフトし、次に、Fence-Postエラーを補正するために1を追加します。

    declare @Samples table (
        StartAt date not null,
        EndAt date not null,
        SampleName varchar(93) not null
    )
    insert into @Samples (StartAt,EndAt,SampleName) values
    ('20170101','20170131','Question - 6'),
    ('20170102','20170129','Exactly 4'),
    ('20170102','20170125','3 and a bit, round to 4'),
    ('20170101','20170129','4 and 1 day, round to 5')
    --DATEDIFF counts *transitions*, and always considers Sunday the first day of the week
    --We subtract a day from each date so that we're effectively treating Monday as the first day of the week
    --We also add one because DATEDIFF counts transitions but we want periods (FencePost/FencePanel)
    select *,
        DATEDIFF(WEEK, DATEADD(day,-1,StartAt), DATEADD(day,-1,EndAt)) +1
        as NumWeeks
    from @Samples
    

    結果:

    StartAt    EndAt      SampleName                 NumWeeks
    ---------- ---------- -------------------------- -----------
    2017-01-01 2017-01-31 Question - 6               6
    2017-01-02 2017-01-29 Exactly 4                  4
    2017-01-02 2017-01-25 3 and a bit, round to 4    4
    2017-01-01 2017-01-29 4 and 1 day, round to 5    5
    

    これがあなたの望むものと一致しない場合は、おそらく私の@Samplesを採用して適応させることができます 期待する結果を示す表。



    1. SQLでデータベーステーブルを作成すると、奇妙なエラーが発生します

    2. 結果を表示せずにSQLクエリを実行する方法

    3. PDOを使用してOracleに接続できませんでした

    4. mySQLのクロス集計ビュー?