2011-07-29 19 views
13

Bir sorgu yapmam ve yılın tüm günlerine katılmam gerekiyor ama db'mde takvim tablosu yok.
Google'dan sonra PostgreSQL'de generate_series()'u buldum. MySQL'in benzer bir şeyi var mı?generate_series() MySQL içinde eşdeğer

Benim gerçek tablo gibi bir şey vardır:

date  qty 
1-1-11 3 
1-1-11 4 
4-1-11 2 
6-1-11 5 

Ama benim sorgu dönmek zorundadır:

1-1-11 7 
2-1-11 0 
3-1-11 0 
4-1-11 2 
and so on .. 
+0

Neden bunu uygulama mantık katmanınızda yapamazsınız? – Shef

+3

Uygulama mantığında yapılacak "doğru" çözüm değil. Daha iyi, gerçekten sql üzerinden yapmak daha iyi (eğer mümkünse). Eğer mümkün olmazsa ... tamam, uygulama mantığımda yapacağım ... – stighy

+0

@stighly: Peki, sorunun yarısını MySQL üzerinde çözebilirsiniz. Yani, "GROUP BY date" ve "SUM (qty) qty" olabilirsiniz, ancak eksik diziler için satır eklemek için başımın üst kısmındaki herhangi bir çözümü hatırlamıyorum. Bir tarihin qty değeri varsa, bunu gösterse, başka bir şey gösterse, uygulama mantığında bunu yapmak daha iyi olur. – Shef

cevap

23

Bu benim böyle yaparız. Bu 2011-12-31 için 2011-01-01 gelen tarih aralığı oluşturur:

select 
    date_format(
     adddate('2011-1-1', @num:[email protected]+1), 
     '%Y-%m-%d' 
    ) date 
from 
    any_table,  
    (select @num:=-1) num 
limit 
    365 

-- use limit 366 for leap years if you're putting this in production 

tek koşul satır sayısı any_table büyük veya eşit olması gerektiğidir Gerekli aralığın boyutu (> bu örnekte 365 satır). Büyük olasılıkla bunu tüm sorgunuzun bir alt sorgusu olarak kullanacaksınız, bu nedenle sizin durumunuzda any_table bu sorguda kullandığınız tablolardan biri olabilir.

+2

Son derece hacky, ama bir çekicilik gibi çalışır. Tamamen kullanıyorum. Gördüğüm diğer yöntemlerden daha iyi. –

+0

Artık yıllarda bu kırılma olmaz mı? – Milimetric

+0

@Milimetric No. Bir satırda sadece 365 gün çıktı, ancak artık yıl için "366" sınırına ihtiyacınız olabilir. – Karolis

3
o (Artık yıllarda dahil) yıl için çalışmasını sağlar @Karolis gelen solüsyonun

Geliştirilmiş versiyonu:

 
select date from (
    select 
     date_format(
     adddate('2011-1-1', @num:[email protected]+1), 
     '%Y-%m-%d' 
    ) date 
    from 
     any_table, 
    (select @num:=-1) num 
    limit 
     366 
) as dt 
where year(date)=2011 
3

bu çözüme ancak "kodlanmış" tarihi olmayan bakıyordu, ben geldim makyaj Bu ile geçerli bir yıl için geçerli (bu answers yardım). seçme zaten tarih filtreledikçe

where year(date)=2011 

gerekli değildir unutmayınız. Bu şekilde, çalışma zamanı (tarih) "hesaplanan" olduğundan, hangi tablonun (en azından tablonun önünde belirtildiği gibi en az 366 satıra sahip olduğu) önemi yoktur.

select date from (
    select 
     date_format(
     adddate(MAKEDATE(year(now()),1), @num:[email protected]+1), 
     '%Y-%m-%d' 
    ) date 
    from 
     your_table, 
    (select @num:=-1) num 
    limit 
     366) as dt 
İlgili konular