declare @baseDate datetime
set @baseDate = '1 May 2005'
SELECT
datediff(year, @baseDate, [date]) AS YearBucket
,COUNT(*) AS cnt
FROM logins
GROUP BY datediff(year, @baseDate, [date])
ORDER BY datediff(year, @baseDate, [date])
EDIT - Désolé, vous avez raison. Voici une version fixe (je l'ai utilisé une table de test pour commencer ...)
create table logins (date datetime, foo int)
insert logins values ('1 may 2005', 1)
insert logins values ('1 apr 2006', 2)
insert logins values ('1 may 2006', 3)
declare @baseDate datetime
set @baseDate = '1 May 2005'
SELECT
datediff(day, @baseDate, [date])/365 AS YearBucket
,COUNT(*) AS cnt
FROM logins
GROUP BY datediff(day, @baseDate, [date])/365
ORDER BY datediff(day, @baseDate, [date])/365
Modifiez les unités de datediff si vous voulez plus de granularité jours. EDIT # 2 - ok, voici une solution plus robuste qui gère les années bissextiles :) EDIT # 3 - En fait, cela ne gère pas les années bissextiles, mais permet de spécifier des intervalles de temps variables. Aller avec dateadd (année, 1, @baseDate) pour l'approche de l'année bissextile sécuritaire.
declare @baseDate datetime, @interval datetime
[email protected] is expressed as time above 0 time (1/1/1900)
select @baseDate = '1 May 2005', @interval = '1901'
declare @timeRanges table (beginIntervalInclusive datetime, endIntervalExclusive datetime)
declare @i int
set @i = 1
while @i <= 10
begin
insert @timeRanges values(@baseDate, @baseDate + @interval)
set @baseDate = @baseDate + @interval
set @i = @i + 1
end
SELECT
tr.beginIntervalInclusive,
tr.endIntervalExclusive,
COUNT(*) AS cnt
FROM logins join @timeRanges as tr
on logins.date >= tr.beginIntervalInclusive
and logins.date < tr.endIntervalExclusive
GROUP BY tr.beginIntervalInclusive, tr.endIntervalExclusive
ORDER BY tr.beginIntervalInclusive
Donne exactement les mêmes résultats, juste sans l'année en avant. – cdeszaq
@cdeszaq - vous avez raison, désolé à ce sujet. La requête est maintenant fixée, j'aurais dû utiliser une table de test pour commencer .. – ahains
:) Je venais tout juste de m'en occuper moi-même ... mais va-t-il gérer correctement les années bissextiles, ou cela va-t-il introduire des erreurs? – cdeszaq