【问题标题】:How do I do a 'group by' for a datetime when I want to group by just the date?当我只想按日期分组时,如何对日期时间进行“分组”?
【发布时间】:2009-07-06 16:44:21
【问题描述】:

这是一个非常尴尬的标题:)

我需要编写一份按日期生成拒绝列表的报告。日期存储为日期时间字段,并按日期时间返回拒绝次数。

这是我的 SQL:

select ps.date_scheduled, count(*) from payments_schedule ps
left join invoices i on i.invoice_id=ps.invoice_id
left join orders o on o.order_id=i.order_id
where ps.date_scheduled>'2009-06-01 00:00:00'
group by ps.date_scheduled

2009-06-25 14:13:04 1 2009-06-25 14:13:07 1 ..等等...

不酷。我想要的是这样的: 2009-06-25 25 2009-06-26 31 等等……

我该怎么做?谢谢:)

【问题讨论】:

  • 将日期时间转换为日期,然后按日期列分组。

标签: mysql


【解决方案1】:
SELECT  CAST(ps.date_scheduled AS DATE), COUNT(*)
FROM    payments_schedule ps
LEFT JOIN
        invoices i
ON      i.invoice_id = ps.invoice_id
LEFT JOIN
        orders o
ON      o.order_id = i.order_id
WHERE   ps.date_scheduled > '2009-06-01 00:00:00'
GROUP BY
        CAST(ps.date_scheduled AS DATE)

【讨论】:

  • Quass - CAST 比 DATE() 更有效吗?
  • @Paolo:不,它们是完整的同义词。我更喜欢这种语法以避免与返回月份日期的 DAY() 混淆。
【解决方案2】:
GROUP BY DATE(ps.date_scheduled)

【讨论】:

  • 这是我倾向于使用的,虽然我从未对它进行基准测试。不确定 MySQL 是否为此使用索引(如果可用),或者是否每次都重新计算每条记录的 DATE()。如果它重新计算,新列可能是有序的。
【解决方案3】:

将您的查询更改为select DATEADD(day, 0, DATEDIFF(day, 0, ps.date_scheduled))。这将仅保留日期时间的日期部分。您还需要按相同的表达式进行分组。

编辑:这是为 SQL Server 解决问题的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-28
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多