查询以检查一个月内创建的记录数。

时间:2015-04-28 21:50:16

标签: sql sql-server

当集成成功时,我的表会每天创建一个带有时间戳的新记录。我正在尝试创建一个查询,该查询将检查(最好是自动化)一个月内的天数与一个时间范围内表中的记录数。

例如,1月有31天,所以我想知道1月份有多少天我的流程没有成功。如果记录数小于31,那么我知道作业失败31 - x次。

我尝试了以下但是没有走得太远:

SELECT COUNT (DISTINCT CompleteDate)
FROM table
WHERE CompleteDate BETWEEN '01/01/2015' AND '01/31/2015'

系统每7天执行两次作业,所以我在同一天得到两条记录,但我试图确定没有发生任何事件的天数(失败),所以我假设日期字段的一些截断是需要的?!

4 个答案:

答案 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

SQL Fiddle Demo

<强>解释

  1. CROSS APPLY - ied,即t.d,是CompleteDate月份第一天的ANSI字符串,例如2015年1月12日,或2015年1月18日'20150101'
  2. DATEDIFF使用上述值,即t.d,以计算CompleteDate所属月份的天数。
  3. GROUP BY基本上按(年,月)分组,因此COUNT(DISTINCT CompleteDate)会返回每月不同记录的数量。
  4. 查询返回的值是[2] - 1的差异,即每个(年,月)初始数据的每月失败次数。
  5. 如果您想查询特定的年,月,那么只需在上面添加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'