ISO Haftası ve SQL Server Haftası


33

Tamam, bu hafta geçen hafta karşılaştırmaya göre bu hafta yapan bir raporum var ve müşterilerimiz verilerinin "korkak" olduğunu fark ettiler. Daha ileri araştırmalar sonucunda ISO standartlarına göre haftaların doğru olmadığını gördük. Bu senaryoyu bir test davası olarak çalıştırdım.

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')

Koşarken bu sonuçları aldım.

Sonuç kümesi

Bunun kendine özgü olduğunu düşündüm ve bu yüzden biraz daha araştırma yaptım ve SQL Server’ın yılın ilk haftası olan ISO’nun Ocak ayının ilk Pazar günü saydığı yılın ilk haftası olarak 1 Ocak’ta sayıldığını gördüm.

Ardından soru iki kat olur. Soru 1 neden bu? Soru 2 bunu değiştirmenin bir yolu var, bu yüzden ISO_Weekher yerde kullanmak için kodumu değiştirmek zorunda kalmayacağım ?

Yanıtlar:


27

SQL Server WEEKtarih / bölümü ilk kez uyguladığında, bir seçim yapmak zorunda kaldılar. O zamanlar en yaygın standarda uymak dışında, bunun hakkında çok fazla bilinç olduğunu sanmıyorum - bunun standartlara uygunluğun öncelikli olmadığı bir zaman olduğunu hatırlayın (aksi halde böyle şeyler olmazdı) timestamp, IDENTITYve TOP). Daha sonra eklediler ISO_WEEK(2008'e inanıyorum) çünkü bu arada geçici çözüm kendi, yavaş, berbat skaler UDF'nizi yazmaktı - aslında çok kötü bir tane bile yarattılar ve resmi belgelere koydular (o zamandan beri kaldırıldı) söylediğim gibi).

Ben yapmak için bir yol bilmiyorum DATEPART(WEEKo iddia DATEPART(ISO_WEEK? Var kaç basamak bu hesaplamayı gerçekleştirdiğiniz - Sana kodunu değiştirmek zorunda olacağını düşünüyorum (ve kaynak denetimi kullanıyorsanız, bu çok zor olmamalı - bir yerde onu hesaplamayı düşündün, bu yüzden kodunun onunla karıştırılması gerekmiyor mu? Kodu şimdi değiştirdiğin için, bunu düşünmenin zamanı gelebilir ...).

Ve gerçekten nedenini cevaplamak istiyorsan ? Sanırım neden yaptıkları varsayılanı seçtiklerini belirlemek için orijinal geliştiricilerin bir kısmını kapmak zorunda kalacaksınız. Yine, bence gerçek "F standartlar!" seçim, ama daha doğrusu, "Ne standartları?"

Burada yararlı olabilecek bazı bilgiler var:

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


Teknik olarak tek yapmam gereken DimCalendar tablomu değiştirmek. Maalesef geliştiricilerimiz bunu birkaç rapor örneğinde kullanmamaya karar verdi, böylece anında hesaplanıyor. Genel olarak bu, merakta bir krizden ziyade meraklı bir egzersizdi.
Zane

5
Geliştiricilerinize kovboy kodlaması yerine en iyi uygulamaları izlemeleri için raporlarını güncellemelerini öneririm. Ama bu sadece benim.
Aaron Bertrand

1
İyi haber, bir haftadan daha kısa sürede artık benim geliştiricim olmayacaklar. :)
Zane

2

Yılın ilk haftası için farklı koşullar kabul eden birkaç makam var. Bazıları haftanın ilk gününün ilk haftaya başladığını varsayar, ancak en yaygın fikir ilk Perşembe olan ilk haftanın yılın ilk haftası olduğudur.

Öyleyse ISO_WEEK, 2010, 2011 veya 2012'de olduğu gibi ISO_WEEK1 Ocak’ın 52. veya 53. hafta olduğunu WEEKya WKda WWilk hafta olduğunu söylediklerini kontrol ederek kabul edersiniz .

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.