棘手的sql-选择日期和。。。填写缺失的日期

棘手的sql-选择日期和。。。填写缺失的日期,sql,sqlite,Sql,Sqlite,SQLite数据库。简单表格: MyTable - columns: Date, Value 我想为给定的日期范围选择记录。到目前为止,这很简单,但是。。。。如果给定范围内的某些日期没有记录,我只想得到2014-01-01,0给定日期之类的行作为示例,我希望给定范围内缺少的每个日期都有此空记录 预期结果: 2013-12-31, 10 2014-01-01, 0 2014-01-02, 0 2014-01-03,22 假设给定范围为2013-12-31-2014-01-03,且1月1日和2日

SQLite数据库。简单表格:

MyTable - columns: Date, Value
我想为给定的日期范围选择记录。到目前为止,这很简单,但是。。。。如果给定范围内的某些日期没有记录,我只想得到2014-01-01,0给定日期之类的行作为示例,我希望给定范围内缺少的每个日期都有此空记录

预期结果:

2013-12-31, 10
2014-01-01, 0
2014-01-02, 0
2014-01-03,22
假设给定范围为2013-12-31-2014-01-03,且1月1日和2日的记录缺失


因此,问题是如何在结果查询中完成缺少日期的记录。有没有机会用SQL而不是java来做这件事?

如果是我,我会在Excel中创建一个日期表,从1900到2100或类似的数字,然后逐日递增。然后你可以做类似的事情

SELECT dl.date, CASE WHEN t.value IS NOT NULL THEN t.value ELSE 0 END AS value 
FROM {date_lookup_table} AS dl 
LEFT OUTER JOIN {your_table} as t 
ON dl.date = t.date WHERE dl.date 
BETWEEN {start} AND {end}
显然,括号内的术语必须根据您的需要进行更改


你能填一下数据吗?是的,我相信你能。但是使用日期表要简单得多,如果是我的话,你会一次又一次地使用它,我会创建一个日期查找表,例如,星期几、月、年、日和所有预先填充的日期。。。这可以在Excel中轻松完成,正如另一个答案所建议的,您可以通过从一个充满日期的实用程序表中进行连接来完成。在本文的最后是一个示例SQL,它可以方便地构建这样一个表。然后,您可以根据实用程序表进行查询,并根据实际数据进行左联接。这将显示行,即使是数据间隙:

SELECT d.day, SUM(m.value) AS value_sum
FROM utility_day d
LEFT JOIN mytable m ON d.day = m.`date`
WHERE d.day BETWEEN "2013-12-31" AND "2014-01-03"
GROUP BY d.day;
这是一个例子

创建日表的示例实用程序:

# Create utility_day table.

CREATE TABLE `utility_day` (
  `day` date default NULL,
  PRIMARY KEY  (`day`)
) ENGINE=InnoDB;

INSERT IGNORE utility_day (day)
SELECT DATE_ADD("2000-01-01", INTERVAL ones.num + tens.num + hundreds.num + thousands.num DAY) AS day
FROM
(
SELECT 0 num UNION ALL
SELECT 1 num UNION ALL
SELECT 2 num UNION ALL
SELECT 3 num UNION ALL
SELECT 4 num UNION ALL
SELECT 5 num UNION ALL
SELECT 6 num UNION ALL
SELECT 7 num UNION ALL
SELECT 8 num UNION ALL
SELECT 9 num
) ones
CROSS JOIN
(
SELECT 0 num UNION ALL
SELECT 10 num UNION ALL
SELECT 20 num UNION ALL
SELECT 30 num UNION ALL
SELECT 40 num UNION ALL
SELECT 50 num UNION ALL
SELECT 60 num UNION ALL
SELECT 70 num UNION ALL
SELECT 80 num UNION ALL
SELECT 90 num
) tens
CROSS JOIN
(
SELECT 0 num UNION ALL
SELECT 100 num UNION ALL
SELECT 200 num UNION ALL
SELECT 300 num UNION ALL
SELECT 400 num UNION ALL
SELECT 500 num UNION ALL
SELECT 600 num UNION ALL
SELECT 700 num UNION ALL
SELECT 800 num UNION ALL
SELECT 900 num
) hundreds
CROSS JOIN
(
SELECT 0 num UNION ALL
SELECT 1000 num UNION ALL
SELECT 2000 num UNION ALL
SELECT 3000 num UNION ALL
SELECT 4000 num UNION ALL
SELECT 5000 num UNION ALL
SELECT 6000 num UNION ALL
SELECT 7000 num UNION ALL
SELECT 8000 num UNION ALL
SELECT 9000 num
) thousands
WHERE DATE_ADD("2000-01-01", INTERVAL ones.num + tens.num + hundreds.num + thousands.num DAY) < "2030-01-01";

Excel不是我的解决方案,但这个想法很有趣。谢谢你的帮助。这是一个非常有趣的想法,尽管我觉得用java处理它会更容易,然后创建另一个巨大的表。我只是想知道SQL中是否存在未知的技巧,可以完成丢失的日期,但基于这些答案,SQL中可能不存在类似的东西。谢谢你的帮助。