2010-10-18 20 views
7

MySQL select deyimindeki bir tarihten sonraki haftaları hesaplamam gerekiyor. Tablolardan birinde bir tarih sütunu var ve tarihin kaç hafta olduğunu hesaplamam gerekiyor.MySQL: Belirli bir tarihten itibaren haftalar nasıl hesaplanır?

SELECT EventDate, (calculation) AS WeeksOut FROM Events; 

Örnek:

  • 6 gün uzağında hafta üzerinden = 0
  • 7 gün uzağında hafta üzerinden = 1
  • 13 gün uzağında hafta üzerinden = 1
  • 14 gün uzakta, haftasonu = 2
+0

Kısmi haftalar için ne yapmak istersiniz? Örneğin: 3.2857 hafta 3 hafta, 4 hafta veya arada bir şey olmalı mı? –

+0

Evet, en yakın haftaya yuvarlatılmış olmalı – Andrew

cevap

17

DATEDIFF function:

ROUND(DATEDIFF(end_date, start_date)/7, 0) AS weeksout 

WEEKS ile ilgili sorun, 1 Ocak'ı aşan tarihler için doğru sonuçları döndürmeyeceğidir.

0, ROUND işlevinde kullanılacak ondalık basamak sayısıdır.

+1

+1 Yeni yıl sayısında iyi bir nokta, bunun hakkında bir düşünceyi düşünmemişti ... –

+0

Artı bir Ama daha iyi açıklamalar için bağlantıyı belgeye ekleyebilir misiniz? Neden 7'den sonra? –

+1

@JohnMax: 0. –

3

İşte bunu yapmak için basit bir yolu:

SELECT EventDate, (week(EventDate) - week(curdate())) AS WeeksOut FROM Events; 

Örnek:

mysql> select week('2010-11-18') - week ('2010-10-18'); 
+------------------------------------------+ 
| week('2010-11-18') - week ('2010-10-18') | 
+------------------------------------------+ 
|          4 | 
+------------------------------------------+ 
1 row in set (0.00 sec) 

Diğer bir seçenek 7'den tarafından günlerde aralığını bölün hesaplamak:

SELECT EventDate, datediff(EventDate,curdate())/7 AS WeeksOut FROM Events; 

Örnek:

mysql> select datediff('2010-11-18' , '2010-10-18')/7; 
+-------------------------------------------+ 
| datediff('2010-11-18' , '2010-10-18')/7 | 
+-------------------------------------------+ 
|         4.4286 | 
+-------------------------------------------+ 
1 row in set (0.00 sec) 
+0

hakkında daha fazla bilgi Benim tarafımdan güzel açıklama +1 – w3uiguru

2

Tüm "Yeni Yıl" sorununu aşmak ve hala WEEK() kullanmak istiyorsanız, aşağıdaki yöntemi oldukça etkili buldum.

SELECT 
    YEAR(end_date)*52+WEEK(end_date) 
    - YEAR(start_date)*52 - WEEK(start_date) as weeks_out 
FROM 
    events; 

(DATEDIFF yönteme zıt olarak) Bu yöntem ile fark hafta ile uyumlu olmasıdır. Bu yüzden bugün (Pazartesi olan) ve geçen Cuma, bu yöntemi kullanarak 1'u döndürür, ancakyöntemiyle 0 döndürür

İlgili konular