2012-08-09 13 views
6

kod aşağıda:? Ben tarih yatıyor çeyrek başlangıç ​​tarihini bulmak için benim 'ın yerine koymak için ne olduğunu öğrenmek için çalışıyorumMySQL'de çeyreğin ilk randevusunu nasıl alabilirim? Bugüne kadar var

SELECT 
QUARTER(r.callDate) AS quar, 
YEAR(r.callDate) AS ryear, 
???????? AS scoreDateStart, 
(SELECT DATE (DATE_SUB(DATE_ADD(CONCAT(YEAR(r.callDate), '-01-01'), INTERVAL QUARTER(r.callDate) QUARTER), INTERVAL 1 DAY))) AS scoreDateEnd, 
group_concat(DISTINCT(r.resultId) separator ', ') AS resultIds 
FROM results AS r 
GROUP BY quar, ryear 
ORDER BY quar; 

ben. Googling'i denedi, ancak boşuna.

çıktı bir örnek olacaktır:

'1', '2012', '2012-01-01', '2012-03-31', '57, 58, 59' 
'2', '2012', '2012-04-01', '2012-06-30', '10549, 10551, 12598' 
+0

Örnekler ekleyebilir misiniz? beklenen çıktı? – Jocelyn

+0

İyi Fikir Jocelyn, teşekkürler! Bir örnek eklemek için gönderimi düzenledim. – richie

cevap

16

bu deneyin: Yani Sorgu olurdu

SELECT MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE()) QUARTER 
             - INTERVAL 1 QUARTER 

:

akım çeyrek kullanımı bu başlangıç ​​tarihini almak için :

SELECT 
QUARTER(r.callDate) AS quar, 
YEAR(r.callDate) AS ryear, 
MAKEDATE(YEAR(r.callDate), 1) + INTERVAL QUARTER(r.callDate) QUARTER - 
    INTERVAL 1 QUARTER AS scoreDateStart, 
(SELECT DATE (DATE_SUB(DATE_ADD(CONCAT(YEAR(r.callDate), '-01-01'), 
INTERVAL QUARTER(r.callDate) QUARTER), INTERVAL 1 DAY))) AS scoreDateEnd, 
group_concat(DISTINCT(r.resultId) separator ', ') AS resultIds 
FROM results AS r 
GROUP BY quar, ryear 
ORDER BY quar; 
+1

Bence bu hile yaptı, ben şimdi test ediyorum. Teşekkürler Joe! – richie

+1

Bu, bir tarih dizesi için CURDATE() değiştirerek, geçerli tarih dışında bir çeyreğin başlangıç ​​tarihini bulmak için genelleştirilebilir. –

+1

Geçerli çeyreğin son gününe ihtiyacınız varsa, "INTERVAL 1 QUARTER" yerine "INTERVAL 1 DAY" ile çıkartın. –

İlgili konular