【问题标题】:Select count between range of date选择日期范围之间的计数
【发布时间】:2018-02-19 04:19:25
【问题描述】:

我想计算两个日期之间的所有条目(包括上周到今天),如果没有,请选择 0。目前打印如下:

+-------+------------+
| items | SellDate   |
+-------+------------+
| 1     | 2017-01-01 |
+-------+------------+
| 3     | 2017-01-02 |
+-------+------------+
| 1     | 2017-01-03 |
+-------+------------+
| 5     | 2017-01-06 |
+-------+------------+

但是,我需要这样打印的东西:

+-------+------------+
| items | SellDate   |
+-------+------------+
| 1     | 2017-01-01 |
+-------+------------+
| 3     | 2017-01-02 |
+-------+------------+
| 1     | 2017-01-03 |
+-------+------------+
| 0     | 2017-01-04 |
+-------+------------+
| 0     | 2017-01-05 |
+-------+------------+
| 5     | 2017-01-06 |
+-------+------------+
| 0     | 2017-01-07 |
+-------+------------+

我的查询如下所示:

SELECT 
    COUNT(Item.id) AS Items,
    DATE(Item.sold_at) AS SellDate
FROM Item
WHERE Item.sold_at IS NOT NULL AND Item.sold_at BETWEEN DATE(DATETIME('now', 'localtime', '-6 days')) AND DATE(DATETIME('now', 'localtime', '+1 day'))
GROUP BY SellDate

我做错了什么?

【问题讨论】:

标签: sql date select sqlite count


【解决方案1】:

据我所知,如果没有 SQLite 3.8.3 及更高版本支持的recursive common table expression,这是不可能的。使用相应的版本,您可以通过将日期范围与项目列表连接来做到这一点:

WITH RECURSIVE dates(date) AS (
  VALUES(DATE(DATETIME('now', 'localtime', '-6 days')))
  UNION ALL
  SELECT date(date, '+1 day')
  FROM dates
  WHERE date < DATE(DATETIME('now', 'localtime', '+1 day'))
)
SELECT 
    date,
    COUNT(Item.id) AS Items
FROM 
    dates
LEFT JOIN
    Item
ON
    dates.date = Item.SellDate
GROUP BY
    SellDate

【讨论】:

  • 这个解决方案效果很好,性能也很好。我稍微调整的一件事是+1 day。我完全删除了它,因为它明天给我。该行是WHERE date &lt; DATE(DATETIME('now', 'localtime'))。我还在GROUP BY 之后添加了ORDER BY dates.date,因为否则日期不按顺序排列。任何计数为零的东西都在最上面。其余的都很完美。谢谢,我知道我今天可以使用RECURSIVE,我会尽快阅读
猜你喜欢
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
相关资源
最近更新 更多