ISO WeekとSQL Server Week


33

さて、今週と先週の比較を行うレポートがありますが、お客様はデータが「ファンキー」であることに気付きました。さらに調査した結果、ISO規格に従って数週間は正しく動作していませんでした。このスクリプトをテストケースとして実行しました。

SET DATEFIRST 1
SELECT DATEPART(WEEK, '3/26/13')
    , DATEPART(WEEK, '3/27/12')
    , DATEPART(WEEK, '3/20/12')
    , DATEPART(WEEK, '1/2/12')
SELECT DATEPART(ISO_WEEK, '3/26/13')
    , DATEPART(ISO_WEEK, '3/27/12')
    , DATEPART(ISO_WEEK, '3/20/12')
    , DATEPART(ISO_WEEK, '1/2/12')

実行すると、これらの結果が得られました。

ResultSet

これは奇妙だと思ったので、さらに掘り下げてみると、SQL Serverは1月1日を年の最初の週としてカウントし、ISOは1月の最初の日曜日を年の最初の週としてカウントします。

質問は最終的に2倍になります。質問1これはなぜですか?質問2これを変更する方法はあるので、ISO_Weekどこでも使用するためにすべてのコードを変更する必要はありませんか?

回答:


27

SQL Serverが最初にWEEK日付/部分を実装したとき、彼らは選択をしなければなりませんでした。当時の最も一般的な標準に合わせる以外は、あまり意識がなかったと思います-これは、標準への準拠が最優先事項ではなかったことを思い出してください(そうでない場合は、timestampIDENTITYおよびTOP)。彼らは後で追加しましたISO_WEEK(2008年と思われます)その間の回避策は、あなた自身の遅くてくだらないスカラーUDFを書くことでした-実際、彼らは本当に悪いものを作成して公式文書に入れました(それは今のところ削除されています)私が言うことができるように)。

DATEPART(WEEKふりをする方法がわかりませんDATEPART(ISO_WEEK-コードを変更する必要があると思います(そして、ソース管理を使用している場合、これはそれほど難しくないはずです-この計算を何箇所実行していますか?)コードをいじり回す必要がないようにどこかで計算することを考えましたか?コードを今変更しているので、これを検討する時が来るかもしれません...)。

そして、なぜあなたが本当に答えが欲しいのですか?元の開発者の何人かをつかんで、彼らがしたデフォルトを選んだ理由を判断する必要があると思います。繰り返しますが、これは実際の「標準規格」ではなかったと思います。選択肢ではなく、「どのような標準ですか?」

ここに役に立つかもしれないいくつかの情報があります:

https://stackoverflow.com/questions/348880/getting-week-number-off-a-date-in-ms-sql-server-2005

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/iso-week-in-sql-server


技術的に私がしなければならないのは、残念ながらDimCalendarテーブルを変更することです。残念ながら、開発者は複数のレポートインスタンスで使用しないことを決定したため、その場で計算されます。概して、これはあらゆる種類の危機よりも好奇心の行使でした。
ゼーン

5
開発者にカウボーイコーディングではなくベストプラクティスに従うようにレポートを更新することをお勧めします。しかし、それは私だけです。
アーロンバートランド

1
良いニュースは、もう1週間も経たないうちに私の開発者ではなくなることです。:)
ゼーン

2

年の最初の週に異なる条件を想定するいくつかの当局があります。週の最初の日が最初の週から始まると考える人もいますが、最も一般的な考え方は、最初の木曜日を持つ最初の週が年の最初の週であるというものです。

だから、ISO_WEEKあなたはそれを確認することができますようことなどが2010年、2011年または2012年に受け入れ、ISO_WEEK1月1日にしながら、第52または第53週であると言いますWEEKか、WKまたはWW、彼らは最初の週あると言います。

SELECT DATEPART (WW,'01/01/2010')   --> 1
SELECT DATEPART (WK,'01/01/2010')   --> 1
SELECT DATEPART (WEEK,'01/01/2010')   --> 1
SELECT DATEPART (ISO_WEEK,'01/01/2010')   --> 53
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.