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

SQL Server 2005 の Isoweek

    http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510

    これは関数の古いコードです

    CREATE function f_isoweek(@date datetime)
    RETURNS INT
    as
    BEGIN
    DECLARE @rv int
    
    SELECT @rv = datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)
    FROM (SELECT dateadd(ww, datediff(day, 0, @date)/7, 3) day4) a
    
    RETURN @rv
    END
    

    @AndriyM のすばらしい回答を自分の回答と組み合わせた後、1 行になりました。これが新しいコードです。

    CREATE function f_isoweek(@date datetime)
    RETURNS INT
    as
    BEGIN
    
    RETURN (datepart(DY, datediff(d, 0, @date) / 7 * 7 + 3)+6) / 7
    -- replaced code for yet another improvement.
    --RETURN (datepart(DY, dateadd(ww, datediff(d, 0, @date) / 7, 3))+6) / 7
    
    END
    

    古いコードの説明 (新しいコードについては説明しません。私のコードと AndriyM のコードの断片です):

    選択した日付の平日 4 を見つける

    dateadd(week, datediff(day, 0, @date)/7, 3) 
    

    isoyear の検索 - 週 4 の曜日の年は、常にその週の isoyear と同じ年です

    datediff(yy, 0, day4)
    

    アイソイヤーの最初の日に 3 日を追加すると、アイソイヤーの最初のアイソウィークのランダムな日が見つかります

    dateadd(yy, datediff(yy, 0, day4),3)
    

    isoyear の最初の isoweek の相対的な週を見つける

    datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7
    

    最初の isoweek の月曜日から 4 日を引いたものを見つけると、その isoyear の最初の isoweek の最初の日より前の木曜日になります

    dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)
    

    最初の isoweek の前の週の最初の木曜日と、選択した週の最初の木曜日がわかれば、週の計算が非常に簡単になります。両方の日付の平日が木曜日であるため、どの datefirst を設定しても問題ありません。

    datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)
    


    1. equal to 操作で SQL_AltDiction_CP850_CI_AS と SQL_Latin1_General_CP1_CI_AS の間の照合の競合を解決できません

    2. clojure.java.jdbcからデータベースを削除または作成するにはどうすればよいですか?

    3. UTF-8とLatin1mysql、utf-8では使用されないインデックス

    4. MySQLでdatediffを数分で合計