WITH numbers ( n ) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM numbers WHERE n < 500 )
SELECT DATEADD(day,n-1,'2008/11/01') FROM numbers
OPTION ( MAXRECURSION 500 )
Declare @FromDate datetime,
@ToDate datetime
Declare @tmpDates table
(StatsDate datetime)
Set @FromDate = DateAdd(day,-30,GetDate())
Set @ToDate = GetDate()
Insert Into @tmpDates (StatsDate)
Select
distinct CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME)
FROM tbl_visitorstats
Where visitDate between @FromDate And @ToDate
Order By CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME)
Select * FROM @tmpDates
DECLARE @startDate datetime
SET @startDate = '2015/5/29';
WITH number ( n ) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM dates WHERE n < DATEDIFF(Day, @startDate, GETDATE()) )
SELECT DATEADD(day,n-1,@startDate) FROM number where
datename(dw, DATEADD(day,n-1,@startDate)) in ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')
OPTION ( MAXRECURSION 500 )
DECLARE @startDate DATE SET @startDate = ( SELECT CAST (MIN ([timeGenerated]) AS DATE) FROM idl_sourceTable )
DECLARE @endDate DATE SET @endDate = ( SELECT CAST (MAX ([timeGenerated]) AS DATE) FROM idl_sourceTable )
DECLARE @dateRange INT SET @dateRange = ( SELECT DATEDIFF (DAY, @startDate, @endDate) )
SELECT @startDate, @endDate, @dateRange;
-- Create #tempDateTable containing dates delimited between the MIN and MAX timeGenerated of idl_sourceTable
DROP TABLE IF EXISTS #tempDateTable;
WITH numbers_CTE ( n ) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM numbers_CTE WHERE n <= @dateRange )
SELECT DATEADD (DAY, n-1, @startDate) AS [date] INTO #tempDateTable FROM numbers_CTE
OPTION ( MAXRECURSION 0 ) -- disables the default 100 recursion level for the CTE
SELECT * FROM #tempDateTable
-- Display dates which are not represented in idl_sourceTable
SELECT basis.[date] AS [missingDays] FROM #tempDateTable basis
LEFT JOIN ( SELECT DISTINCT CAST ( [timeGenerated] AS DATE ) AS [objectDate] FROM idl_sourceTable ) AS object ON object.[objectDate] = basis.[date]
WHERE object.[objectDate] IS NULL
9条答案
按热度按时间xa9qqrwz1#
严格地说,这并没有完全回答你的问题,但它相当整洁。
假设您可以指定起始日期之后的天数,则使用公用表表达式可以:
w9apscun2#
我会创建一个Calendar表,其中只包含从合适的开始日期到合适的结束日期的每个日期,这样不会占用数据库中太多的空间,并且会使这些类型的查询变得非常简单。
ojsjcaue3#
我想你最好用while循环来做,我知道这很难,但是很简单,而且很有效。
f45qwnt84#
不久前我也在做类似的事情,但是我想不出一个不使用循环的方法。
我得到的最好的是一个临时表,然后选择我想加入其中的日期。
bduke链接到的博客很可爱,尽管我认为临时表解决方案可能是一个更干净的解决方案。
xe55xuns5#
我发现另一个表存储每个日期(它是网站的访问者),那么这个怎么样...
它确实依赖于另一个表为我想要的每个日期都有一个条目,但是98%的可能性是每天都有数据。
ryhaxcpt6#
对https://stackoverflow.com/a/95728/395440给出的答案稍做修改。允许指定天数,并计算到当前日期的范围。
atmip9wb7#
你必须编辑下面的LEFT JOIN语句,这样它才能给你的统计表贴上标签,以适合你的用例。同时,这里有一些受BigJump答案启发的东西,是用TSQL写的。
要求:
1.必须创建包含连续日期的表。
1.结果应该允许从记录具有DATETIME字段的其他表中检测缺失的日期。
bq9c1y668#
只需要编写循环。必须有人为此编写循环,无论是您还是SQL Server。
dgtucam19#
只是:WHERE列〉开始日期AND列〈结束日期