2016-03-31 13 views
2

Aşağıdaki sorgu (MSSQL'de) soruna doğru bir cevap verir: aylık olarak kaç tane IP toplandı? Her 60 günde bir sayıyı nasıl alabilirim?datepart() kullanarak her 60 günde bir sayımı nasıl alabilirim?

select MIN(rowdate) min_rowdate, 
     MAX(rowdate) max_rowdate, 
     count(distinct IP), 
     DATEPART(MONTH, rowdate) month_ 
from t_tbl tl (nolock) 
where rowdate between '2015-01-01 00:00:00' and '2015-12-31 23:59:59' 
group by DATEPART(MONTH, rowdate) 

cevap

3

Bunu DATEDIFF ve bazı basit matematik kullanarak alabilirsiniz: Bu durumda

select MIN(rowdate) min_rowdate, MAX(rowdate) max_rowdate, count(distinct IP), 
     DATEDIFF(day, 0, rowdate)/60 as day60 
from t_tbl tl (nolock) 
where rowdate >= '20150101' and rowdate < '20160101' 
group by DATEDIFF(day, 0, rowdate)/60 

, bu kullanıyor 1900-01-01 ilk 60 başlangıcı olarak (Ne 0 dönüştürülür alır) Gün periyodu ve takip eden tüm dönemler oradan devam eder. Eğer raporlama dönemleri için farklı bir "sabit nokta" kullanmak istiyorsanız

, sen DATEDIFF ikinci parametre olarak 0 yerine koydular olur.

+0

Teşekkür @Damien_The_Unbeliever

(bir sıfır olmayan milisaniye değeri ile sırasında 2015, yani son saniye oldu bir olay dışlamaz böylece de WHERE maddesini düzeltilmiş ettik), ben Bu satırın içine bir tarih koymaya çalıştım: DATEDIFF (gün, '2015-01-01', rowdate)/60 ile grup ama "... bir toplama işlevi veya GROUP BY deyiminde yer almayan bir hata veriyor" SQL için oldukça yeni .. – mql4beginner

+0

Neden açık tarih yerine 'DATEDIFF''de' 0' kullanıyorsunuz? Burada birkaç tuş vuruşu kaydettiniz ve "rowdate" veri türü "datetime" dan "datetime2" ye değiştiğinde kod kırılacak. Benim endişem burada kötü uygulamaları teşvik ediyor. –

İlgili konular