Comment puis-je regrouper par colonne date-heure sans prendre en compte le temps

221

J'ai plusieurs commandes de produits et j'essaie de regrouper par date et de additionner la quantité pour cette date. Comment regrouper par mois / jour / année sans prendre en compte la partie temps?

3/8/2010 7:42:00 doit être groupé avec 3/8/2010 4:15:00

L'homme aux muffins
la source
2
Voir aussi groupe
Michael Freidgeim

Réponses:

374

Cast / Convertissez les valeurs en un Datetype pour votre groupe par.

GROUP BY CAST(myDateTime AS DATE)
Oded
la source
3
savez-vous comment je ferais la même chose avec LINQ to SQL?
The Muffin Man
1
@ Nick - pas sûr. Essayez d'utiliser DateTime.Date.
Odé
3
- Linq à Sql: DateTime.Date- Entity Framework:EntityFunctions.TruncateTime(myDateTime)
The Muffin Man
1
Je suis d'accord, je répondais à The Muffin Man qui posait des questions à ce sujet dans un contexte ORM.
Niels Brinch
4
Merci beaucoup ... cela a résolu mon problème. ajouté «group by CAST (date_modified AS DATE)». n'oubliez pas d'ajouter le même (CAST (date_modified AS DATE)) dans la cluase sélectionnée.
Mohammed mansoor
25
GROUP BY DATEADD(day, DATEDIFF(day, 0, MyDateTimeColumn), 0)

Ou dans SQL Server 2008 , vous pouvez simplement caster Date comme @Oded l'a suggéré:

GROUP BY CAST(orderDate AS DATE)
Blé Mitch
la source
16

En pré sq 2008 En retirant la partie date:

GROUP BY CONVERT(CHAR(8),DateTimeColumn,10)
Kamyar
la source
2
Pour des explications sur la fonction de conversion et le type de date et d'heure (signification de char (8) et 10), voir w3schools.com/sql/func_convert.asp
super1ha1
7

GROUP BY DATE(date_time_column)

Aravindh Gopi
la source
2

Voici un exemple que j'ai utilisé lorsque j'ai eu besoin de compter le nombre d'enregistrements pour une date particulière sans la partie heure:

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)
user3169774
la source
1
L'ORDRE PAR ne fonctionnera pas comme supposé car il ne le traitera pas comme une date, il sera donc trié par jour
Weapon X
2

Voici l'exemple fonctionne bien dans Oracle

select to_char(columnname, 'DD/MON/yyyy'), count(*) from table_name group by to_char(createddate, 'DD/MON/yyyy');
Radhakrishnan
la source
2

Champ datetime CAST à ce jour

select  CAST(datetime_field as DATE), count(*) as count from table group by CAST(datetime_field as DATE);
Ruchira
la source
0

Je pense que vous devez vous regrouper en ce jour du mois de l'année. alors pourquoi ne pas utiliser les fonctions TRUNK_DATE. Son fonctionnement est décrit ci-dessous:

Group By DATE_TRUNC('day' , 'occurred_at_time')
alireza
la source
date_trunc est pour PostgreSQL pas SQL Server qui passe par les balises, l'OP cherchait une solution pour SQL server.
Dave Hogan