2010-02-18 11 views
6

Eminim ki burada çok basit bir şeye bakıyordum ama yaklaşık bir saat boyunca sorgulamadan ve googling yaptıktan sonra kafamın etrafına dolamıyorum.SQL'de Get Weeks

Halihazırda varolan bir randevum var, eğer yardımcı oluyorsa. Bu geçmiş yılların değerleriyle doldurulur ve sunucuda bir iş tarafından çalıştırılan depolanmış bir proc ile gece boyunca güncellenir.

Yapmam gereken şey, Pazartesi-Pazar günlerini dışarı çekmektir, böylece haftalık bir grafik elde etmek için bunları bir izleme tablosuna düzgün bir şekilde ekleyebilirim. 52 tane daha geniş seçme deyimi yazmak istemiyorum ve açık nedenlerle onları birleştirmek istemiyorum ve ben imleç fikrini sevmiyorum.

Bunu aylar ve günlerle yaptım, ancak haftaların doğası beni bir nedenden dolayı karıştırıyor ya da doğal olarak farklı.

İşlemi imleçler veya büyük bir seçim/birleştirme olmadan nasıl otomatikleştireceğinize dair herhangi bir düşünce var mı? İmleç için gideceğim ve kesinlikle gerekliyse her gece bir masaya dökeceğim ama umarım değil.

Bilginize bunun sonunda benim istenen biçim olacaktır: Her Hafta için

[Week number] | [StartDate] | [EndDate] 

Ne isteyen konum ile ders dışı olabilir
+1

kullandığınız hangi DBMS Mutlu? –

+0

Veritabanı Sql 2k5'dir. Benim savunmamda sql olarak etiketlendi :) –

+3

@C Bauer: Bizim savunmamızda, SQL ölçüsü "Structured Query Language", bir veritabanı programlama dili: http://en.wikipedia.org/wiki/SQL :) –

cevap

8

, ancak bu tür istemek gibi geliyor her şeyden:

- örn. AdaTheDev cevabı haklı, ancak varsayılan olarak Pazar Cumartesi hafta boyunca size verecektir - 2009

SELECT DATEPART(wk, DateField) AS WeekNumber, COUNT(*) AS HitsForWeek 
FROM SomeTable 
WHERE DateField >= '20090101' AND DateField < '20100101' 
GROUP BY DATEPART(wk, DateField) 
+0

Teşekkürler, bu istediğim gibi değil ama beni doğru yolda yakaladı! –

3

Bir ekledi şey için, haftanın göre gruplandırılmış kayıtların sayar. Pazar hafta Pazartesi istiyorsanız,

SET DATEFIRST 1

Pazartesi haftanın ilk gününü ayarlamak için çalıştırmak zorunda (1). Ayarlarınızın ne olduğunu görmek için @@ DateFirst öğesini sorgulayabilirsiniz - varsayılan olarak ABD ingilizce yapılandırmasında 7 (Pazar) 'dır.

0

datediff(day, '19800107', yourDate)/7'u (7-Ocak-1980, bilinen bir Pazartesi) kullanmayı tercih edebilirsiniz, böylece sistemin bir hafta başladığını düşündüğü zaman endişelenmenize gerek kalmaz. Ayrıca, bu mekanizma, farklı bir haftaya uyum sağlamak için @@DATEFIRST'un değerini düşünmeksizin, sadece bilinen bir Pazar'ı veya bilinen bir Perşembe'yi veya herhangi bir şeyi seçmek zorunda kalmadan çok kolaydır.

1

Ben de haftalarca zor buldum, aşağıda bir tarihini tarih hafta grubuna dönüştürmek için kullandığım kod. Aşağıda, destekleyici bir tabloyu sürdürmek zorunda kalmadan, Pazartesi ya da Hafta başlayarak hafta içi haftaya geri dönecek örnekler verilmiştir. Bunları kullanmak istediğiniz şey ise, Cumartesi ve Pazar günleri kullanmak için de ayarlayabilirsiniz.

--Returns the weekending (Friday) for a particular day 
SELECT DATEADD(day, -DATEPART(weekday,yourDate), yourDate)+6 

--Returns the week commencing (Monday) for a particular day 
SELECT DATEADD(day, -DATEPART(weekday,yourDate)+2, yourDate) 

kodlama :)