Je veux énumérer toutes les ventes et regrouper la somme par jour.
Sales (saleID INT, amount INT, created DATETIME)
Mise à jour J'utilise SQL Server 2005
si vous utilisez SQL Server,
dateadd(DAY,0, datediff(day,0, created))
retournera le jour créé
par exemple, si la vente créée le '2009-11-02 06: 12: 55.000', dateadd(DAY,0, datediff(day,0, created))
return '2009-11-02 00: 00: 00.000'
select sum(amount) as total, dateadd(DAY,0, datediff(day,0, created)) as created
from sales
group by dateadd(DAY,0, datediff(day,0, created))
Pour SQL Server:
GROUP BY datepart(year,datefield),
datepart(month,datefield),
datepart(day,datefield)
ou plus rapide (à partir de Q8-Coder):
GROUP BY dateadd(DAY,0, datediff(day,0, created))
Pour MySQL:
GROUP BY year(datefield), month(datefield), day(datefield)
ou mieux (de Jon Bright):
GROUP BY date(datefield)
Pour Oracle:
GROUP BY to_char(datefield, 'yyyy-mm-dd')
ou plus rapide (d'IronGoofy):
GROUP BY trunc(created);
Pour Informix (par Jonathan Leffler):
GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)
Si vous utilisez MySQL:
SELECT
DATE(created) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
saledate
Si vous utilisez MS SQL 2008:
SELECT
CAST(created AS date) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
CAST(created AS date)
en fait, cela dépend du SGBD que vous utilisez, mais dans le langage SQL habituel, convert(varchar,DateColumn,101)
modifiera le format DATETIME pour le mettre à jour (un jour)
alors:
SELECT
sum(amount)
FROM
sales
GROUP BY
convert(varchar,created,101)
le numéro de magix 101
est le format de date auquel il est converti
Si vous utilisez SQL Server, vous pouvez ajouter trois champs calculés à votre table:
Sales (saleID INT, amount INT, created DATETIME)
ALTER TABLE dbo.Sales
ADD SaleYear AS YEAR(Created) PERSISTED
ALTER TABLE dbo.Sales
ADD SaleMonth AS MONTH(Created) PERSISTED
ALTER TABLE dbo.Sales
ADD SaleDay AS DAY(Created) PERSISTED
et maintenant vous pouvez facilement grouper par, commander par etc. par jour, mois ou année de la vente:
SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay
Ces champs calculés seront toujours tenus à jour (lorsque votre date "Créé" changera), ils feront partie de votre table, ils pourront être utilisés comme des champs normaux, et pourront même être indexés (s'ils sont "PERSISTED") ) - grande fonctionnalité qui est totalement sous-utilisé, à mon humble avis.
Marc
Pour Oracle, vous pouvez
group by trunc(created);
car cela tronque la date/heure créée à minuit précédent.
Une autre option est de
group by to_char(created, 'DD.MM.YYYY');
ce qui donne le même résultat, mais peut être plus lent car il nécessite une conversion de type.
Pour PostgreSQL:
GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
ou en utilisant la fonte:
GROUP BY timestampfield::date
si vous voulez de la vitesse, utilisez la deuxième option et ajoutez un index:
CREATE INDEX tablename_timestampfield_date_idx ON tablename(date(timestampfield));