SQL Server GROUP BY datetime ignora ora minuto e una selezione con una data e un valore di somma


86

Ho una tabella con due campi - datetimee int. Voglio fare un gruppo da datetimesolo alla data ignorando l'ora e il minuto. L' SELECTistruzione dovrebbe restituire una data che corrisponde alla somma dell'int di un singolo giorno.


1
accettare una delle risposte sarebbe carino ( solo il richiedente può farlo )
Used_By_Already

Risposte:


138
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)

11
Funzionerà solo in SQL Server 2008+ (quando è stato introdotto il tipo di dati Date). Se sei nel 2005 o prima, la modifica del cast in convert (convert (int, Datetimefield), datetime) dovrebbe funzionare.
Derek Kromm

Ricevo un errore che dice che "Tipo di data non è un tipo di sistema definito".
Steven

5
@Steven - quindi guarda il commento di Derek. Questo è il motivo per cui è una buona idea includere la tua VERSIONE nella domanda.
JNK

@ Derek questo non sembra funzionare. A select convert(convert(int, getdate()), datetime)fallisce con un errore di sintassi errato
rabudde

1
scusa, convert (datetime, convert (int, getdate ()))
Derek Kromm

24

Poiché non ha specificato quale versione del server SQL utilizza (il datetipo non è disponibile nel 2005), si potrebbe anche utilizzare

SELECT CONVERT(VARCHAR(10),date_column,112),SUM(num_col) AS summed
FROM table_name
GROUP BY CONVERT(VARCHAR(10),date_column,112)

Nelle versioni precedenti come la conversione varchar 2000/2005 per questa esigenza è più lenta rispetto all'uso diDATEADD(dd, DATEDIFF(dd, 0, date_field),0)
Used_By_Already

7

Sono venuto alla ricerca delle opzioni che avrei dovuto fare, tuttavia, credo che il metodo che uso sia il più semplice:

SELECT COUNT(*), 
       DATEADD(dd, DATEDIFF(dd, 0, date_field),0) as dtgroup 
FROM TABLE 
GROUP BY DATEADD(dd, DATEDIFF(dd, 0, date_field),0) 
ORDER BY dtgroup ASC;

1
Funzionerà in qualsiasi versione di SQL Server ed è più veloce rispetto all'utilizzo delle conversioni varchar.
Usato_By_Already

Potresti chiarire cosa si intende per "gg"? Non capisco cosa dovresti metterci dentro.
BelovedFool

"dd" è datapart equivalente al giorno. Puoi anche usare "giorno", "d" o "gg"
Jefferson Silva

3

- Mi piace perché il tipo di dati e il formato rimangono coerenti con un tipo di dati data e ora

;with cte as(
    select 
        cast(utcdate as date) UtcDay, DATEPART(hour, utcdate) UtcHour, count(*) as Counts
    from dbo.mytable cd 
    where utcdate between '2014-01-14' and '2014-01-15'
    group by
        cast(utcdate as date), DATEPART(hour, utcdate)
)
select dateadd(hour, utchour, cast(utcday as datetime)) as UTCDateHour, Counts
from cte

2

Personalmente preferisco la funzione di formattazione, ti permette di cambiare semplicemente la parte della data molto facilmente.

     declare @format varchar(100) = 'yyyy/MM/dd'
     select 
        format(the_date,@format), 
        sum(myfield) 
     from mytable 
     group by format(the_date,@format) 
     order by format(the_date,@format) desc;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.