当集成成功时,我的表会每天创建一个带有时间戳的新记录。我正在尝试创建一个查询,该查询将检查(最好是自动化)一个月内的天数与一个时间范围内表中的记录数。
例如,1月有31天,所以我想知道1月份有多少天我的流程没有成功。如果记录数小于31,那么我知道作业失败31 - x次。
我尝试了以下但是没有走得太远:
SELECT COUNT (DISTINCT CompleteDate)
FROM table
WHERE CompleteDate BETWEEN '01/01/2015' AND '01/31/2015'
系统每7天执行两次作业,所以我在同一天得到两条记录,但我试图确定没有发生任何事件的天数(失败),所以我假设日期字段的一些截断是需要的?!
答案 0 :(得分:1)
执行此操作的一种方法是使用日历/日期表作为范围中日期的主要来源,并使用该表连接并计算空值的数量。
如果没有合适的日期表,您可以使用scope: { foo: '&?'}
表中的数字序列生成一系列日期:
master..spt_values
Sample SQL Fiddle(按月分组计数)
答案 1 :(得分:0)
您可以使用以下查询:
SELECT DATEDIFF(day, t.d, dateadd(month, 1, t.d)) - COUNT(DISTINCT CompleteDate)
FROM mytable
CROSS APPLY (SELECT CAST(YEAR(CompleteDate) AS VARCHAR(4)) +
RIGHT('0' + CAST(MONTH(CompleteDate) AS VARCHAR(2)), 2) +
'01') t(d)
GROUP BY t.d
<强>解释强>
CROSS APPLY
- ied,即t.d
,是CompleteDate
月份第一天的ANSI字符串,例如2015年1月12日,或2015年1月18日'20150101'
。DATEDIFF
使用上述值,即t.d
,以计算CompleteDate
所属月份的天数。GROUP BY
基本上按(年,月)分组,因此COUNT(DISTINCT CompleteDate)
会返回每月不同记录的数量。如果您想查询特定的年,月,那么只需在上面添加WHERE
子句:
WHERE YEAR(CompleteDate) = 2015 AND MONTH(CompleteDate) = 1
答案 2 :(得分:0)
假设你有Integers
表*。此查询将提取目标表中未找到记录的所有日期:
declare @StartDate datetime = '01/01/2013',
@EndDate datetime = '12/31/2013'
;with d as (
select *, date = dateadd(d, i - 1 , @StartDate)
from dbo.Integers
where i <= datediff(d, @StartDate, @EndDate) + 1
)
select d.date
from d
where not exists (
select 1 from <target> t
where DATEADD(dd, DATEDIFF(dd, 0, t.<timestamp>), 0) = DATEADD(dd, DATEDIFF(dd, 0, d.date), 0)
)
答案 3 :(得分:0)
之间不安全
SELECT 31 - count(distinct(convert(date, CompleteDate)))
FROM table
WHERE CompleteDate >= '01/01/2015' AND CompleteDate < '02/01/2015'