2016-03-22 9 views
0

Projemde görevlerden biri, yeni raporların ve işlerin günlük raporunu 24 saat içinde gerçekleştirmektir. tamir ekiplerinin hafta sonu çalışmadığı, ancak raporların doğal olarak hala gelebileceği bildirildi. Bu nedenle Pazartesi sabahı bir rapor üretilecek, son 3 gündeki tüm raporlar gösterilecek. Örneğin: fri - mon ve fri üzerinde yapılan tüm onarımlar aşağıdaki kodla benzer .Gün olarak bir değer olarak değerlerin seçilmesi

Çıkarılmamış bulduğum bir çözüm, iki tarih fiedini göstermektir ve kullanıcı, başka bir işlev için aşağıda oluşturduğum kod gibi fri & tek tarihi seçer. Ben istiyorum

SELECT `defect_Id`, `job_Id`, `date_On_Task`, `description`, `resolved` 
FROM `job` 
WHERE `date_On_Task` >= '$date1' 
AND `date_On_Task` <= '$date2' 
AND `repair_Team` = '$repair_Team' 
AND `resolved` = 3" 

gün * < 1 göstermez eğer gün = Pazartesi gösterisi * < 3gün eğer iç içe sql ifadelere açıklamada eğer kullanmak mümkün.

Seçme ifadesi, bir günün değişkeni ile ilgili herhangi bir bilgiyi bulmak için uğraştığım bir konu olduğu için, örneğin CURDATE() geçerli tarihi seçer, ancak SQL bir tarihi tarihe dönüştürebilir mi?

cevap

0

Uygulamanızdan hem tarih seçicilerinden kurtulabilirsiniz.

Bunun için CASE ifadesini kullanarak WHERE fıkrada mantık geçerli olabilir:

WHERE 
    CASE WHEN WEEKDAY(CURRENT_DATE) = 0 
     THEN `date_On_Task` = CURRENT_DATE - INTERVAL 3 DAY 
     ELSE `date_On_Task` = CURRENT_DATE - INTERVAL 1 DAY 
    END 

WEEKDAY() fonksiyon Pazartesi 0 döner ve fıkra Pazartesi günleri uygulanacağı yeri aşağıdaki neden olur:

WHERE `date_On_Task` = CURRENT_DATE - INTERVAL 3 DAY 

Fonksiyon başka bir şey döndürürse (1'den 6'ya Salı'dan Pazar'a kadar) dün gerçekleştirilmiş işler alın.

Belirli bir tarihten sonra günlerin sonlandırılması basittir. Sen DATE_SUB() kullanabilir veya böyle INTERVAL substract olabilir:

<DATE HERE> - INTERVAL <NUMBER HERE> DAY 

Tam sorgu görünecektir: Böyle bir

SELECT `defect_Id`, `job_Id`, `date_On_Task`, `description`, `resolved` 
FROM `job` 
WHERE 
    CASE WHEN WEEKDAY(CURRENT_DATE) = 0 
     THEN `date_On_Task` = CURRENT_DATE - INTERVAL 3 DAY 
     ELSE `date_On_Task` = CURRENT_DATE - INTERVAL 1 DAY 
    END 
    AND `repair_Team` = '$repair_Team' 
    AND `resolved` = 3 
+0

Kodum mu tam olarak. Lütfen cevabı tekrar okuyun. 'WEEKDAY()' işlevi Pazartesi için '0' döndürür. –

0

Kind (?):

WHERE 
    [date_On_Task] BETWEEN 
    CASE 
     WHEN DATENAME(DW, GETDATE()) = 'Monday' THEN CAST(GETDATE() - 3 AS date) 
     WHEN DATENAME(DW, GETDATE()) = 'Sunday' THEN CAST(GETDATE() - 2 AS date) 
     ELSE CAST(GETDATE() - 1 AS date) 
    END 
     AND 
    CAST(GETDATE() AS date) 
+0

Bu, daha fazlasını görmeyi beklediğim gibi, yöneticinin intranet sitesine hafta sonu da erişemeyeceğini varsayabilir, böylece Sunday ifadesine gerek kalmaz. –

+0

Evet, mantığı nasıl kullanmak istediğinize bağlı, ama bu genel bir fikir. Hiçbir zaman kullanılmayacağından emin olursanız 'Pazar' hattını kaldırabilirsiniz. –