5

我有一个简单的查询,可以提取我们当天的支付报告。我想每天晚上自动发送此报告,但是我希望报告在每天上午 12:00 - 晚上 11:59 运行...我将在晚上 9:00 发送报告,所以我想它如果这样更容易的话,只需要到晚上 9:00。

这是我的查询:

SELECT        COUNT(*) AS Number, SUM(dblPayoutAmt) AS Amount
FROM            Payouts
WHERE        (dtCreated BETWEEN @startdate AND @enddate)
4

6 回答 6

6

不要使用 BETWEEN,使用 >= 开始日期和 < 结束日期之后的一天:

WHERE (dtCreated >= @startdate AND dtCreated < DATEADD(day, 1, @enddate))

原因是 BETWEEN 会一直查找到结束日期的上午 12:00,但不会超过该时间。

更新

对于今天的日期,您可以这样做:

WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, dtCreated)) = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

这将检查它是否dtCreated等于今天的某个点。

更新

正如@ScottChapman 指出的那样,您可以通过DATE直接转换为类型来做同样的事情而无需转换体操。但是,此类型仅在 MSSQL 2008 及更高版本中可用。

于 2012-12-19T19:57:40.287 回答
2
SET @StartDate = CAST(GETDATE() AS date)
SET @EndDate = DATEADD(MINUTE, -1, DATEADD(DAY, 1, @StartDate))

SELECT        COUNT(*) AS Number, SUM(dblPayoutAmt) AS Amount
FROM            Payouts
WHERE        (dtCreated BETWEEN @startdate AND @enddate)
于 2012-12-19T19:58:22.567 回答
2

其中一些答案很接近,但不包括一天中最后一分钟的时间,例如晚上 11:59:30。此查询将包括今天的所有内容:

SELECT        COUNT(*) AS Number, SUM(dblPayoutAmt) AS Amount
FROM            Payouts
WHERE        (dtCreated >= CAST(GETDATE() as date) AND dtCreated < DATEADD(day, 1, CAST(GETDATE() as date)))

请注意,这在 SQL Server 2005 或更低版本中不起作用,因为该date类型是在 SQL Server 2008 中添加的。

于 2012-12-19T20:12:23.030 回答
1

当您使用 SQL/Server 2008 时,您可以从 DATETIME 列中删除任何时间元素,方法是将其转换为 DATE 并选择它,例如

SELECT COUNT(*) AS Number, SUM(dblPayoutAmt) AS Amount
  FROM Payouts
 WHERE CONVERT(DATE,dtCreated) = CONVERT(DATE,GETDATE())

优雅得多

[编辑] 哦,我刚刚阅读了 Scott Chapman 的回答,这更好,因为如果 dtCreated 被索引,那么查询将更有效率。

于 2012-12-19T20:13:49.980 回答
0

前面的答案还包括 < 12.00 am 的数据

SELECT 
  COUNT(*) AS Number
  , SUM(dblPayoutAmt) AS Amount
FROM 
  Payouts
WHERE
  dtCreated >= dateadd( hour, 12, cast( cast( getdate() as date ) as datetime ))
  and dtCreated < dateadd( second, -1, dateadd(day, datediff(day, -1, getdate()), 0))
于 2012-12-19T20:01:45.230 回答
0

将它们都设置为简单的日期示例:BETWEEN '2012-12-19' AND '2012-12-20'没有时间戳,然后选择两者之间。

在此示例中,如果您将结束日期设置为'2012-12-20 23:59:59.999'然后执行 aSELECT @enddate它返回'2012-12-21 00:00:00.000'

或使用函数类型语法:

  declare @mystart as datetime
  declare @myend as datetime
  set @mystart = dateadd(day,datediff(day,0,CURRENT_TIMESTAMP),0)
  set @myend = dateadd(day,datediff(day,0,CURRENT_TIMESTAMP),1) 
  select @mystart, @myend

这里的@mystart 设置为仅日期部分(时间为 00:00:00.000),并且结束发送到该日期加上一天,因此 BETWEEN 语法有效。

于 2012-12-19T20:37:39.010 回答