Я хочу перечислить все продажи и группировать сумму за день.
Sales (saleID INT, amount INT, created DATETIME)
Обновление Я использую SQL Server 2005
Я хочу перечислить все продажи и группировать сумму за день.
Sales (saleID INT, amount INT, created DATETIME)
Обновление Я использую SQL Server 2005
если вы используете SQL Server,
dateadd(DAY,0, datediff(day,0, created))
вернется созданный день
например, если продажа, созданная в 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))
Для SQL Server:
GROUP BY datepart(year,datefield),
datepart(month,datefield),
datepart(day,datefield)
или быстрее (от Q8-Coder):
GROUP BY dateadd(DAY,0, datediff(day,0, created))
Для MySQL:
GROUP BY year(datefield), month(datefield), day(datefield)
или лучше (от Jon Bright):
GROUP BY date(datefield)
Для Oracle:
GROUP BY to_char(datefield, 'yyyy-mm-dd')
или быстрее (от IronGoofy):
GROUP BY trunc(created);
Для Informix (Джонатан Леффлер):
GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)
Если вы используете MySQL:
SELECT
DATE(created) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
saledate
Если вы используете MS SQL 2008:
SELECT
CAST(created AS date) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
CAST(created AS date) AS saledate
Если вы используете SQL Server, вы можете добавить три таблицы в таблицу:
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
и теперь вы можете легко группировать, заказывать и т.д. день, месяц или год продажи:
SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay
Эти рассчитанные поля всегда будут обновляться (когда изменяется ваша "Созданная" дата), они являются частью вашей таблицы, они могут использоваться как обычные поля и даже могут быть проиндексированы (если они "PERSISTED" ) - отличная особенность, которая полностью недоиспользована, ИМХО.
Марк
на самом деле это зависит от того, какую СУБД вы используете, но в обычном SQL convert(varchar,DateColumn,101)
изменит формат DATETIME на сегодняшний день (один день)
так:
SELECT
sum(amount)
FROM
sales
GROUP BY
convert(varchar,created,101)
номер магии 101
- это формат даты, который он преобразует в
Для оракула вы можете
group by trunc(created);
так как это сокращает созданное datetime до предыдущей полуночи.
Другой вариант -
group by to_char(created, 'DD.MM.YYYY');
который достигает одного и того же результата, но может быть медленнее, поскольку требует преобразования типа.
Для PostgreSQL:
GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
или используя листинг:
GROUP BY timestampfield::date
если вы хотите скорость, используйте вторую опцию и добавьте индекс:
CREATE INDEX tablename_timestampfield_date_idx ON tablename(date(timestampfield));
использовать linq
from c in Customers
group c by DbFunctions.TruncateTime(c.CreateTime) into date
orderby date.Key descending
select new
{
Value = date.Count().ToString(),
Name = date.Key.ToString().Substring(0, 10)
}