SQL-显示两个日期之间的所有日期
我在[OccurrendAtUTC]中将以下数据保存为日期,如下所示: -扰流板警报:2017-04-26和2017-04-29缺失 [UTC]中的原始日期: 我有一段代码,它正确地返回了前一周两次间隔的数据SQL-显示两个日期之间的所有日期,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在[OccurrendAtUTC]中将以下数据保存为日期,如下所示: -扰流板警报:2017-04-26和2017-04-29缺失 [UTC]中的原始日期: 我有一段代码,它正确地返回了前一周两次间隔的数据 SELECT [MessageType].[Name] AS [Channel], CONVERT(VARCHAR(11), [OccuredAtUtc], 106) AS [Time], COUNT(*) AS [Count] FROM
SELECT
[MessageType].[Name] AS [Channel],
CONVERT(VARCHAR(11), [OccuredAtUtc], 106) AS [Time],
COUNT(*) AS [Count]
FROM @table1
INNER JOIN @table2 ON ... = ...
WHERE ( [OccuredAtUtc] > '2017-04-24'
AND [OccuredAtUtc] < '2017-04-30' )
GROUP BY (CONVERT(VARCHAR(11), [OccuredAtUtc], 106)),
[MessageType].[Name]
ORDER BY [Time] ASC
我想显示丢失日期的行,即使这一天没有保存事件
所以新的输出应该是这样的
想要的输出:
我知道有像我这样的问题得到了回答,我试图重新编写代码,但失败了
您可以使用类似于计数表的东西来生成特定时间间隔之间的所有日期
SELECT
ISNULL([MessageType].[Name],0) AS [Channel],
dates AS [Time],
COUNT([MessageType].[Name]) AS [Count]
FROM
(
SELECT
TOP (DATEDIFF(d,'2017-04-24','2017-04-30')+1)
DATEADD(d,ROW_NUMBER() OVER( ORDER BY (SELECT 1))-1,'2017-04-24') dates
FROM sys.objects a CROSS JOIN sys.objects b
)T
LEFT JOIN
@table1 ON T.dates=CONVERT(VARCHAR(11), @table1.[OccuredAtUtc], 106)
LEFT JOIN @table2 ON ... = ...
AND ( [OccuredAtUtc] > '2017-04-24'
AND [OccuredAtUtc] < '2017-04-30' )
GROUP BY dates,
[MessageType].[Name]
ORDER BY [Time] ASC
有关理货表的更多解释,请阅读与@DhruvJoshi的答案类似的内容,但使用递归CTE生成日期:
DECLARE @MinDate DATE = '20170424',
@MaxDate DATE = '20170430';
WITH allDates AS
(
SELECT @MinDate AS dates
UNION ALL
SELECT DATEADD(DAY, 1, ad.[dates] )
FROM allDates AS ad
WHERE ad.[dates] < @MaxDate
)
SELECT
ISNULL([MessageType].[Name],0) AS [Channel],
dates AS [Time],
COUNT([MessageType].[Name]) AS [Count]
FROM
(
SELECT dates
FROM allDates
) AS T
LEFT JOIN
@table1 ON T.dates=CONVERT(VARCHAR(11), @table1.[OccuredAtUtc], 106)
LEFT JOIN @table2 ON ... = ...
GROUP BY dates,
[MessageType].[Name]
ORDER BY [Time] ASC
请核对我的答案我不认识Joshi。。。首先,谢谢你给我理货台的提示,我从来没有听说过这样的事情。无论如何,我尝试了这段代码,但它仍然没有显示丢失的日期,列中的输出看起来像2017-04-18 00:00:00.000,而不是2017年4月24日,难道没有一些优雅的解决方案如何解决我的问题?我所需要的就是显示间隔中缺失的日期…:/因为列中的输出看起来像2017-04-18 00:00:00.000,而不是2017年4月24日,所以您始终可以正确设置格式。因为仍然没有显示缺少的日期,这是由于WHERE标准。我已经更正了我的答案。请立即尝试仍然不显示丢失的日期:您可以在此处看到:这是两周前4月16日至4月23日的间隔示例,其中4月17日没有记录。。。因此,17 Apr也不会显示在输出中。-一周前,它的行为是一样的你觉得Joshi怎么样?PS:这不是DBA的问题谢谢你Alex,你解决了我的问题!谢谢我将列从时间更改为日期,但忘记更新其中一个!我有一个建议编辑,因此我已批准:
[Channel] [Time] [Count]
------------------------------------
FTP 24 Apr 2017 7
HTTP 24 Apr 2017 9
FTP 25 Apr 2017 6
HTTP 25 Apr 2017 2
0 26 Apr 2017 0 -- here we go
FTP 27 Apr 2017 56
HTTP 27 Apr 2017 12
FTP 28 Apr 2017 5
HTTP 28 Apr 2017 17
0 29 Apr 2017 0 -- here we go
FTP 30 Apr 2017 156
HTTP 30 Apr 2017 19
SELECT
ISNULL([MessageType].[Name],0) AS [Channel],
dates AS [Time],
COUNT([MessageType].[Name]) AS [Count]
FROM
(
SELECT
TOP (DATEDIFF(d,'2017-04-24','2017-04-30')+1)
DATEADD(d,ROW_NUMBER() OVER( ORDER BY (SELECT 1))-1,'2017-04-24') dates
FROM sys.objects a CROSS JOIN sys.objects b
)T
LEFT JOIN
@table1 ON T.dates=CONVERT(VARCHAR(11), @table1.[OccuredAtUtc], 106)
LEFT JOIN @table2 ON ... = ...
AND ( [OccuredAtUtc] > '2017-04-24'
AND [OccuredAtUtc] < '2017-04-30' )
GROUP BY dates,
[MessageType].[Name]
ORDER BY [Time] ASC
declare @t table ( i int identity , b bit, d as dateadd (dd, i - 1, 0 ))
insert into @t (b)
VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0)
insert into @t (b)
select 0
from @t t1
cross apply ( select b from @t) as t2
cross apply ( select b from @t) as t3
cross apply ( select b from @t) as t4
cross apply ( select b from @t) as t5
select t.d, isnull(y.channel,0), count(y.[date])
from @t t
left join yourtable y on y.[date] = t.d
where d between getdate() - 30 and getdate()
group by t.d, isnull(y.channel,0)
DECLARE @MinDate DATE = '20170424',
@MaxDate DATE = '20170430';
WITH allDates AS
(
SELECT @MinDate AS dates
UNION ALL
SELECT DATEADD(DAY, 1, ad.[dates] )
FROM allDates AS ad
WHERE ad.[dates] < @MaxDate
)
SELECT
ISNULL([MessageType].[Name],0) AS [Channel],
dates AS [Time],
COUNT([MessageType].[Name]) AS [Count]
FROM
(
SELECT dates
FROM allDates
) AS T
LEFT JOIN
@table1 ON T.dates=CONVERT(VARCHAR(11), @table1.[OccuredAtUtc], 106)
LEFT JOIN @table2 ON ... = ...
GROUP BY dates,
[MessageType].[Name]
ORDER BY [Time] ASC