1

我正在尝试返回上个月标记为已完成的所有记录的计数。列名实际结束他的日期时间字段。这是我需要确保记录在上个月完成的同一字段。

这就是我所拥有的

SELECT count(*) 
FROM PhoneCall AS p WITH (nolock) 
WHERE   ( p.actualend >= CAST(CONVERT(varchar(8), DATEADD(dd, - (DAY(DATEADD(mm, 1, GETDATE())) - 1), DATEADD(mm, - 1, GETDATE())), 1) AS datetime)) 
  AND ( p.actualend <= CAST(CONVERT(varchar(8), DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0)), 1) AS datetime))

这段代码给了我更高的结果(我得到的总结果是 847)

但是如果我运行这段代码

SELECT count(*) 
FROM PhoneCall AS p WITH (nolock) 
WHERE p.actualend BETWEEN '03/01/2013 00:00:00' AND '03/31/2013 23:59:59' 

我总共得到 843 条记录。如何更正我的第一个查询以在两个查询中获得相同的总数?

谢谢

4

2 回答 2

1

您的第一个查询不会在最后一天完成所有记录。这是因为最后一天的计算返回正确的日期,时间为 12:00:00 AM。您希望时间部分为晚上 11:59:59。

为了测试查询中的逻辑,我运行了一个 select 语句来查看上个月第一天和最后一天的计算结果:

select CAST(CONVERT(varchar(8), DATEADD(dd, - (DAY(DATEADD(mm, 1, GETDATE())) - 1), DATEADD(mm, - 1, GETDATE())), 1) AS datetime)
select CAST(CONVERT(varchar(8), DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0)), 1) AS datetime)

结果是2013-04-01 00:00:00.0002013-04-30 00:00:00.000。(基于当前日期 2013 年 5 月 7 日)

我建议计算当月的第一天而不是上个月的最后一天,然后进行<比较而不是<=比较。如果记录在一天的最后几毫秒内被标记完成,那么您不必处理会发生什么。

我通过在月底的计算中添加 1 天来修改您的原始查询 - 有效地计算当月的第一天。然后我将比较运算符更改为1而不是<=. 您可能可以改进此计算,但这只是显示逻辑示例的一种快速简便的方法。

SELECT count(*) 
FROM PhoneCall AS p WITH (nolock) 
WHERE ( p.actualend >= CAST(CONVERT(varchar(8), DATEADD(dd, - (DAY(DATEADD(mm, 1, GETDATE())) - 1), DATEADD(mm, - 1, GETDATE())), 1) AS datetime))
  AND ( p.actualend < CAST(CONVERT(varchar(8), DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0)), 1) AS datetime) + 1)
于 2013-05-07T22:27:39.607 回答
1

亚当有一个正确的答案。然而,我认为它可以以一种更容易理解的方式来完成。

在两个日期之间选择数据的要点是使用亚当的第二个查询中的这个逻辑。

where YourField >= @StartDate
and YourField < the day after @EndDate

如果您从应用程序(.net、php、coldfusion 等)调用此查询,在您的应用程序中创建这些变量并将它们作为参数发送可能会更简单。否则,您可能想要执行以下操作:

  declare @EndDate as datetime;
  declare @StartDate as datetime;

  set @EndDate = CAST(CONVERT(varchar(8)
  , DATEADD(dd, - (DAY(DATEADD(mm, 1, GETDATE())) - 1)
 , DATEADD(mm, 0, GETDATE())), 1) AS datetime);

 set @StartDate = DateAdd(month, -1, @EndDate);

 SELECT count(*) 
 FROM lassqls1.CareCredit_MSCRM.dbo.PhoneCall AS p WITH (nolock) 
 WHERE p.actualend >= @StartDate
 and p.actualend < @EndDate
于 2013-05-07T22:45:39.350 回答