2011-02-22 25 views
10

Sadece bir ay içindeki tüm günlerin listesini vermem gerekiyor. Belirli bir masaya erişemiyorum.mysql tablo içermeyen tarihleri ​​seç

Day 
---- 
2011-02-01 
2011-02-02 
2011-02-03 
... etc, etc. 
2011-02-27 
2011-02-28 

Bu oldukça basit olmalıdır, ben düşünürdüm, ben yapmak gerekir sql select deyimi bilselerdi: Şubat ayı göz önüne alındığında, aşağıdaki dönerseniz Yani bir sql select deyimi gerekir. Ay seçilebilir olmalı, bunu, kullanıcının ay ve yılı seçmesine izin veren bir web sayfası seçim kutusundan geçireceğim. Bu bir raporun temeli olacak. Günlerin her birini alacak ve bu tarihlerle ilgili kayıtlara sayım yapacağım bir seçim bildirimi zaten var, ancak bu tabloya raporlarımın bir temeli olarak ihtiyacım var.

+3

Bir tabloya erişmiyorsanız, o zaman sql'yi kullanın? – Val

+0

Neden programlama dilinizde bunu yapmıyorsunuz - muhtemelen çok daha basit. – Knubo

+0

Merak etme, bunun neden sql'de gerçekleştirilmesi gerekiyor? Seçtiğiniz betik dili dilinde daha kolay bir şekilde yapılan garip bir istek gibi görünüyor. –

cevap

16

Yorumlara katılıyorum, bunun gibi bir şey veritabanında yapılmamalı, teknik olarak mümkün. Eğer başlangıç ​​ve bitiş tarihini, gerekirse alt sorgu için ek sayılar ekleyerek verirsek:

SELECT '2011-02-01' + INTERVAL a + b DAY dte 
FROM 
(SELECT 0 a UNION SELECT 1 a UNION SELECT 2 UNION SELECT 3 
    UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 
    UNION SELECT 8 UNION SELECT 9) d, 
(SELECT 0 b UNION SELECT 10 UNION SELECT 20 
    UNION SELECT 30 UNION SELECT 40) m 
WHERE '2011-02-01' + INTERVAL a + b DAY < '2011-03-01' 
ORDER BY a + b 

Sonuçlar:

"2011-02-01" 
"2011-02-02" 
"2011-02-03" 
.... 
"2011-02-28" 
+0

harika, tam olarak ihtiyacım olan şey bu.Ben bu raporlar için bu gece yapmanız gereken yapmak için daha iyi bir yol bulmaya çalışacağım, ama istediğim bu select ifadesi – stephenbayer

+2

sonucunu görmek için olduğunu, şu an benimle bir müşterim var o ben olacak harika çalışıyor herkes bunu daha iyi bir yol var, ama ben kullanmak rapor üreteci tek bir SQL sorgusu dizesinde alır ve bir html tablo döndürür olmadığını görmek için daha detaylı başka bir soru koymak, bu yüzden her süreyle içinden gerçekten döngü can gün ve komut dizim dilimde birden çok sorgu yapın. Her şeyi tek bir SQL sorgusunda içermek zorundayım. – stephenbayer

+0

Ancak bu yazdırma farklı değerleri, tüm değerleri nasıl yazdırabilirim? – saravanakumar

0

- Bu overkill olabilir, ancak böyle bir prosedür yapabilirsiniz :

use dbname; 

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `days_of_month` $$ 

CREATE PROCEDURE `days_of_month`(iDate DATETIME) DETERMINISTIC 

BEGIN 

    DECLARE last_day,mm,yy,dd INT DEFAULT 0; 
    SET dd = 1; 
    SET mm = month(iDate); 
    SET yy = year(iDate); 

    set iDate = case when iDate is null then now() else iDate end; 
    SET last_day = date_format(LAST_DAY(iDate),'%d'); 

    DROP TABLE IF EXISTS `days_of_month_tblTemp`; 
    CREATE TEMPORARY TABLE days_of_month_tblTemp(tmpDate DATE); 

    label1: LOOP 
     insert into days_of_month_tblTemp(tmpDate) values (concat(yy,'-',mm,'-',dd)); 
     SET dd = dd + 1; 
     IF dd < (last_day+1) THEN ITERATE label1; END IF; 
     LEAVE label1; 
     END LOOP label1; 
     SELECT * from days_of_month_tblTemp; 
END $$ 

DELIMITER ; 

- şu şekilde çalıştırın: CALL days_of_month ('2012-02-22');

0
Biraz geçen ay için tüm önceki tarihleri ​​vermek için yükseltmiştir

:

SEÇ (NOW SEÇ Tarih (() -) ara 1 aydan) + ARALIĞI a + b GÜN DAN DTE (0 SEÇ BIR UNION SEÇİMİ 1 BIR UNION SELECT 2 UNION SELECT 3 UNION SEÇ 4 UNION SEÇİMİ 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) d, (SELECT 0 b UNION SELECT 10 UNION SELECT 20 UNION SELECT 30 UNION SELECT 40) m NEREDE (SELECT Date (ŞİMDİ() - ARALIK 1 AYLIK)) + ARALIK a + b GÜN < (tarih seçin (şimdi()))A + b ile 10 SİPARİŞ;

+0

Bunu kırmak ve örnek giriş ve çıkış sağlamak isteyebilirsiniz. – Lizz