Sql查询按天分组

mrb*_*lah 117 sql sql-server group-by sql-server-2005

我想列出所有销售,并按天分组.

Sales (saleID INT, amount INT, created DATETIME)
Run Code Online (Sandbox Code Playgroud)

更新 我正在使用SQL Server 2005

Anw*_*dra 146

如果您使用的是SQL Server,

dateadd(DAY,0, datediff(day,0, created)) 将返回创建的那一天

例如,如果在'2009-11-02 06:12:55.000'上创建销售,则 dateadd(DAY,0, datediff(day,0, created))返回'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))
Run Code Online (Sandbox Code Playgroud)


And*_*mar 99

对于SQL Server:

GROUP BY datepart(year,datefield), 
    datepart(month,datefield), 
    datepart(day,datefield)
Run Code Online (Sandbox Code Playgroud)

或更快(来自Q8-Coder):

GROUP BY dateadd(DAY,0, datediff(day,0, created))
Run Code Online (Sandbox Code Playgroud)

对于MySQL:

GROUP BY year(datefield), month(datefield), day(datefield)
Run Code Online (Sandbox Code Playgroud)

或者更好(来自Jon Bright):

GROUP BY date(datefield)
Run Code Online (Sandbox Code Playgroud)

对于Oracle:

GROUP BY to_char(datefield, 'yyyy-mm-dd')
Run Code Online (Sandbox Code Playgroud)

或更快(来自IronGoofy):

GROUP BY trunc(created);
Run Code Online (Sandbox Code Playgroud)

对于Informix(作者Jonathan Leffler):

GROUP BY date_column
GROUP BY EXTEND(datetime_column, YEAR TO DAY)
Run Code Online (Sandbox Code Playgroud)


Jon*_*ght 37

如果您使用的是MySQL:

SELECT
    DATE(created) AS saledate,
    SUM(amount)
FROM
    Sales
GROUP BY
    saledate
Run Code Online (Sandbox Code Playgroud)

如果您使用的是MS SQL 2008:

SELECT
    CAST(created AS date) AS saledate,
    SUM(amount)
FROM
    Sales
GROUP BY
    CAST(created AS date)
Run Code Online (Sandbox Code Playgroud)

  • 我担心这些例子会以微秒为单位进行分组 (4认同)

yop*_*nic 7

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

所以:

SELECT 
    sum(amount) 
FROM 
    sales 
GROUP BY 
    convert(varchar,created,101)
Run Code Online (Sandbox Code Playgroud)

magix编号101是转换为的日期格式

  • +1 是的,这里解释了 101 的含义 http://msdn.microsoft.com/en-us/library/ms187928.aspx (2认同)

mar*_*c_s 6

如果您使用的是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
Run Code Online (Sandbox Code Playgroud)

现在您可以根据销售日期,月份或年份轻松分组,按订单等排序:

SELECT SaleDay, SUM(Amount)
FROM dbo.Sales
GROUP BY SaleDay
Run Code Online (Sandbox Code Playgroud)

这些计算字段将始终保持最新(当您的"创建"日期更改时),它们是您的表的一部分,它们可以像常规字段一样使用,甚至可以编入索引(如果它们是"PERSISTED") ) - 完全没有充分利用的伟大功能,恕我直言.


Fra*_*dez 5

对于 PostgreSQL:

GROUP BY to_char(timestampfield, 'yyyy-mm-dd')
Run Code Online (Sandbox Code Playgroud)

或使用演员表:

GROUP BY timestampfield::date
Run Code Online (Sandbox Code Playgroud)

如果您想要速度,请使用第二个选项并添加索引:

CREATE INDEX tablename_timestampfield_date_idx ON  tablename(date(timestampfield));
Run Code Online (Sandbox Code Playgroud)