SORU
23 AĞUSTOS 2011, Salı


SQL Server haftanın ilk günü

Hafta kayıtları, haftanın ilk günü olarak toplanan tarih saklamak grup için çalışıyorum. Ancak, standart tekniği kullanmak için yuvarlama tarihleri görünmüyor düzgün ile hafta (yok olsa gün, ay, yıl, çeyrek ve başka bir zaman dilimi verdim uygulanır).

Burada SQL:

select "start_of_week" = dateadd(week, datediff(week, 0, getdate()), 0);

Bu bir Pazartesi günü, bir pazar günü değil 2011-08-22 00:00:00.000 döndürür. @@datefirst seçme verir sunucusu doğru olarak bildiğim kadarıyla Kur yani pazar için kodu 7,.

Bu yeterince kolay için yukarıdaki kodu değiştirerek bypass edebilirim

select "start_of_week" = dateadd(week, datediff(week, 0, getdate()), -1);

Ama böyle bir istisna yapmak zorunda olduğum gerçeği beni biraz rahatsız ediyor. Ayrıca, bu soru için özür dilerim bir kopyası. Bazı soruları ama özellikle bu açıdan ele hiçbiri ilgili buldum.

CEVAP
24 AĞUSTOS 2011, ÇARŞAMBA


Pazartesi ve Salı almıyor sen neden cevap vereyim

Tarih 0 için birkaç hafta ekliyorsun. Ne tarih 0? 1900-01-01. 1900-01-01 gün ne oldu? Pazartesi. Kodunuzda söylüyorsun, kaç hafta, Pazartesi geçti, 1 Ocak 1900? Hadi O [n] der. Tamam, şimdi [n] Pazartesi hafta ekleyin, 1 Ocak 1900. Bu bir Pazartesi bitiren sürpriz olmamalıdır. DATEADD hiçbir fikri olan eklemek istediğiniz hafta ama sadece kadar almak için bir pazar, sadece ekleme 7 gün, sonra 7 gün daha ekleyerek, ... gibi DATEDIFF sadece tanıdığı sınırlar o geçti. Örneğin, bu bazı arkadaşlar biraz mantıklı mantık veya yuvarlak şekilde olmalıdır şikayetçi olsa da 1, geri iki:

SELECT DATEDIFF(YEAR, '2010-01-01', '2011-12-31');
SELECT DATEDIFF(YEAR, '2010-12-31', '2011-01-01');

Bir pazar elde etmek için nasıl cevap vereyim

Eğer bir pazar istiyorsanız, o zaman bir Pazartesi değil ama bir pazar yerine temel bir tarih seç. Örneğin:

DECLARE @dt DATE = '1905-01-01';
SELECT [start_of_week] = DATEADD(WEEK, DATEDIFF(WEEK, @dt, CURRENT_TIMESTAMP), @dt);

Bu DATEFIRST ayarı (veya Kodu farklı bir ayar ile kullanıcı için çalışıyor) değiştir - hala bir pazar geçerli ayarı ne olursa olsun, ister o verdiyse sonu değil. Eğer bu iki cevap gevezelik etmek istiyorsanız, o zaman bir işlevini kullanmanız gerekiryokDATEFIRST ayarı, örneğin bağlıdır

SELECT DATEADD(DAY, 1-DATEPART(WEEKDAY, CURRENT_TIMESTAMP), CURRENT_TIMESTAMP);

Eğer ne Pazartesi, Salı DATEFIRST ayarı değiştirirseniz, bu davranış değişecektir. İstediğiniz bağlı olarak, bu işlevleri kullanabilirsiniz:

CREATE FUNCTION dbo.StartOfWeek1 -- always a Sunday
(
    @d DATE
)
RETURNS DATE
AS
BEGIN
    RETURN (SELECT DATEADD(WEEK, DATEDIFF(WEEK, '19050101', @d), '19050101'));
END
GO

...veya...

CREATE FUNCTION dbo.StartOfWeek2 -- always the DATEFIRST weekday
(
    @d DATE
)
RETURNS DATE
AS
BEGIN
    RETURN (SELECT DATEADD(DAY, 1-DATEPART(WEEKDAY, @d), @d));
END
GO

Şimdi, en iyi gerçekleştiren alternatifler, ama bir sürü var? Eğer herhangi bir büyük farklılıklar olabilir varsa şaşırırım ama bütün cevapları şimdiye kadar sağlanan topladım ve testleri iki set - bir tane daha ve bir tane pahalı denedik. O veya bellek burada performansında bir kısmı bu fonksiyonun nasıl kullanıldığına bağlı olarak devreye girer olsa da) oynamaya/görmüyorum çünkü istemci istatistikleri ölçtüm. Benim test sonuçları:

"Ucuz" atama sorgu:

Function - client processing time / wait time on server replies / total exec time
Gandarez     - 330/2029/2359 - 0:23.6
me datefirst - 329/2123/2452 - 0:24.5
me Sunday    - 357/2158/2515 - 0:25.2
trailmax     - 364/2160/2524 - 0:25.2
Curt         - 424/2202/2626 - 0:26.3

"Pahalı" atama sorgu:

Function - client processing time / wait time on server replies / total exec time
Curt         - 1003/134158/135054 - 2:15
Gandarez     -  957/142919/143876 - 2:24
me Sunday    -  932/166817/165885 - 2:47
me datefirst -  939/171698/172637 - 2:53
trailmax     -  958/173174/174132 - 2:54

İsterseniz Benim testleri detaylar - bu zaten çok oluyor gibi burada uzun soluklu durdurma rölesi edebilirim. Biraz Curt hesaplamalar ve satır içi kod numarası verilen yüksek sonunda en hızlı olarak çıkıp, görünce çok şaşırdım. Belki siz bana bir itirazın fonksiyonları başka bir yerde yayın yok ama daha kapsamlı testler ve blog hakkında o... yaparım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Exalto_Gamer

    Exalto_Gamer

    15 EKİM 2014
  • Fraser Raft

    Fraser Raft

    9 Mart 2010
  • Moto Journal

    Moto Journal

    28 Mayıs 2007