数据库中找不到日期的SQL填充天数
我从函数中获取的数据如下:数据库中找不到日期的SQL填充天数,sql,sql-server,sql-server-2008,outer-join,Sql,Sql Server,Sql Server 2008,Outer Join,我从函数中获取的数据如下: Date | Number 06-02-2012 | 2 06-05-2012 | 5 06-08-2012 | 5 如果我想在以下事项中包括DB中未找到的所有日期,我将如何做 Date | Number 06-02-2012 | 2 06-03-2012 | 0 06-04-2012 | 0 06-05-2012 | 5 06-06-2012 | 0 06-07-2012 | 0
Date | Number
06-02-2012 | 2
06-05-2012 | 5
06-08-2012 | 5
如果我想在以下事项中包括DB中未找到的所有日期,我将如何做
Date | Number
06-02-2012 | 2
06-03-2012 | 0
06-04-2012 | 0
06-05-2012 | 5
06-06-2012 | 0
06-07-2012 | 0
06-08-2012 | 5
SELECT convert(varchar, MIN(DATEADD(wk, DATEDIFF(wk, 0, person.date), 0)), 1), Count(person.ID)
FROM [dbo].[Person] person
WHERE (DATEDIFF(D, person.date, @dateFrom) <=0 AND DATEDIFF(D, person.date, @dateTo) >=0)
GROUP BY DATEPART(WK, person.date)
您可以创建一个临时表或子查询,其中包含所选范围内的所有日期,并对源数据使用左联接。我建议您创建一个日期表—一个包含日期的单列表,例如2000-01-01到2050-12-31。然后,您可以使用左侧联接查询左侧的表,如下所示:
SELECT date_table.date AS [Date], COUNT(your_table.primary_key) AS [Number]
FROM date_table
LEFT JOIN your_table ON date_table.date = your_table.date
WHERE date_table.date BETWEEN '2012-01-01' AND '2012-06-30'
DECLARE @minDate date
DECLARE @maxDate date
SET @minDate = '2012-09-01'
SELECT @maxDate = CAST( CONVERT( CHAR(8), GetDate(), 112) AS DATETIME)
DECLARE @Numbers TABLE(
Date date,
Number int)
WHILE @minDate < @maxDate
BEGIN
INSERT INTO @Numbers
SELECT @minDate, 0
WHERE NOT EXISTS( SELECT Number FROM Numbers WHERE [Date] = @minDate )
SET @minDate = DATEADD(day, 1, @minDate)
END
SELECT n.[Date], ISNULL(n.Number, 0)
FROM @Numbers n
UNION ALL
SELECT Numbers.[Date], ISNULL(Numbers.Number, 0)
FROM Numbers
ORDER BY [Date]
明智地为日期表编制索引,您将得到一个非常高效的查询。如果您只需要一个小的时间间隔,您可以尝试以下功能:
SELECT date_table.date AS [Date], COUNT(your_table.primary_key) AS [Number]
FROM date_table
LEFT JOIN your_table ON date_table.date = your_table.date
WHERE date_table.date BETWEEN '2012-01-01' AND '2012-06-30'
DECLARE @minDate date
DECLARE @maxDate date
SET @minDate = '2012-09-01'
SELECT @maxDate = CAST( CONVERT( CHAR(8), GetDate(), 112) AS DATETIME)
DECLARE @Numbers TABLE(
Date date,
Number int)
WHILE @minDate < @maxDate
BEGIN
INSERT INTO @Numbers
SELECT @minDate, 0
WHERE NOT EXISTS( SELECT Number FROM Numbers WHERE [Date] = @minDate )
SET @minDate = DATEADD(day, 1, @minDate)
END
SELECT n.[Date], ISNULL(n.Number, 0)
FROM @Numbers n
UNION ALL
SELECT Numbers.[Date], ISNULL(Numbers.Number, 0)
FROM Numbers
ORDER BY [Date]
如果您需要更多的月份和年份,那么我认为最好的方法是创建一个带有您所需日期的预填充的永久助手表。并且只对它们进行简单的连接,就像在其他答案中发布的一样。如果您经常使用该表,也可以将其永久化。