Jak mogę grupować według daty i godziny kolumny bez uwzględnienia czasu

221

Mam kilka zamówień na produkty i próbuję pogrupować według daty i zsumować ilość dla tej daty. Jak mogę grupować według miesiąca / dnia / roku bez uwzględnienia części czasu?

3/8/2010 7:42:00 powinien być zgrupowany z 3/8/2010 4:15:00

The Muffin Man
źródło
2
Zobacz także podobną grupę na godzinę
Michael Freidgeim

Odpowiedzi:

374

Przesyłaj / Konwertuj wartości na Datetyp dla swojej grupy według.

GROUP BY CAST(myDateTime AS DATE)
Oded
źródło
3
czy wiesz, jak zrobiłbym to samo z LINQ to SQL?
The Muffin Man
1
@Nick - nie jestem pewien. Spróbuj użyć DateTime.Date.
Oded
3
- Linq do Sql: DateTime.Date- Entity Framework:EntityFunctions.TruncateTime(myDateTime)
The Muffin Man
1
Zgadzam się, odpowiadałem na The Muffin Man, który pytał o to w kontekście ORM.
Niels Brinch
4
Wielkie dzięki ... rozwiązało mój problem. dodano „grupa według CAST (data_modyfikowana JAKO DATA)”. nie zapomnij dodać tego samego (CAST (data_modified AS DATE)) w wybierz cluase.
Mohammed mansoor,
25
GROUP BY DATEADD(day, DATEDIFF(day, 0, MyDateTimeColumn), 0)

Lub w programie SQL Server 2008 i Date nowszych wersjach można po prostu przesyłać według sugestii @Oded:

GROUP BY CAST(orderDate AS DATE)
Mitch Pszenica
źródło
16

W wersji sprzed Sql 2008 poprzez wyjęcie części daty:

GROUP BY CONVERT(CHAR(8),DateTimeColumn,10)
Kamyar
źródło
2
Aby uzyskać wyjaśnienie dotyczące funkcji konwersji i typu daty i godziny (znaczenie znaków
super1ha1
7

GROUP BY DATE(date_time_column)

Aravindh Gopi
źródło
2

Oto przykład, którego użyłem, gdy potrzebowałem zliczyć liczbę rekordów dla określonej daty bez przedziału czasowego:

select count(convert(CHAR(10), dtcreatedate, 103) ),convert(char(10), dtcreatedate, 103)
FROM dbo.tbltobecounted
GROUP BY CONVERT(CHAR(10),dtcreatedate,103)
ORDER BY CONVERT(CHAR(10),dtcreatedate,103)
użytkownik3169774
źródło
1
ORDER BY nie będzie działać zgodnie z planem, ponieważ nie będzie traktować go jako daty, więc będzie sortować według dnia
Weapon X
2

Oto przykład, który działa dobrze w wyroczni

select to_char(columnname, 'DD/MON/yyyy'), count(*) from table_name group by to_char(createddate, 'DD/MON/yyyy');
Radhakrishnan
źródło
2

Dotychczasowe pole daty i godziny CAST

select  CAST(datetime_field as DATE), count(*) as count from table group by CAST(datetime_field as DATE);
Ruchira
źródło
0

Uważam, że musisz pogrupować według, w tym dniu miesiąca. więc dlaczego nie skorzystać z funkcji TRUNK_DATE. Sposób działania opisano poniżej:

Group By DATE_TRUNC('day' , 'occurred_at_time')
Alireza
źródło
date_trunc jest dla PostgreSQL, a nie SQL Server, który przechodząc przez tagi, OP szukał rozwiązania dla SQL Server.
Dave Hogan