按日分组的 SQL 查询

我想列出所有的销售额,并按日分组。

Sales (saleID INT, amount INT, created DATETIME)

注意: 我正在使用 SQLServer2005。

256310 次浏览

如果您正在使用 SQLServer,

dateadd(DAY,0, datediff(day,0, created))将返回创建的日期

例如,如果在“2009-11-0206:12:55.000”上创建的销售, dateadd(DAY,0, datediff(day,0, created))回报’2009-11-0200.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))

如果你正在使用 MySQL:

SELECT
DATE(created) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
saledate

如果您正在使用 MSSQL2008:

SELECT
CAST(created AS date) AS saledate,
SUM(amount)
FROM
Sales
GROUP BY
CAST(created AS date)

为了神谕,你可以

group by trunc(created);

因为这会将创建的日期时间截断到前一个午夜。

另一个选择是

group by to_char(created, 'DD.MM.YYYY');

它达到相同的结果,但可能会慢,因为它需要一个类型转换。

对于 SQLServer:

GROUP BY datepart(year, datefield),
datepart(month, datefield),
datepart(day, datefield)

或更快(从 Q8-编码器) :

GROUP BY dateadd(DAY, 0, datediff(day, 0, created))

对于 MySQL:

GROUP BY year(datefield), month(datefield), day(datefield)

或者更好(来自 Jon Bright) :

GROUP BY date(datefield)

对甲骨文来说:

GROUP BY to_char(datefield, 'yyyy-mm-dd')

或更快(来自 IronGoofy) :

GROUP BY trunc(created);

对于 Informix (by Jonathan Leffler) :

GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)

实际上,这取决于您使用的是什么样的 DBMS,但在常规的 SQL convert(varchar,DateColumn,101)中,DATETIME 格式将更改为日期(某一天)

所以:

SELECT
sum(amount)
FROM
sales
GROUP BY
convert(varchar,created,101)

魔术数字 101是它被转换成的日期格式

如果使用 SQLServer,可以向表中添加三个计算字段:

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”)——恕我直言,这是一个完全没有得到充分利用的伟大特性。

马克

对于 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)
}