如何在“今天”的日期从凌晨12:00到晚上11:59运行查询

时间:2012-12-19 19:54:11

标签: sql sql-server sql-server-2008

我有一个简单的查询,可以获取当天的付款报告。我想自动发送这个每晚发送,但我希望报告每天上午12:00 AM - 晚上11:59运行...我将在晚上9:00发送报告,所以我想它如果这更容易,只需要到晚上9点才能到达。

这是我的问题:

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

6 个答案:

答案 0 :(得分:5)

请勿使用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及更高版本中可用。

答案 1 :(得分: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)

答案 2 :(得分: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或更低版本中无效,因为SQL Server 2008中添加了date类型。

答案 3 :(得分: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编入索引,那么查询将更有效。

答案 4 :(得分:0)

前面的答案还包括数据&lt;上午12点

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))

答案 5 :(得分:0)

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

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

OR使用函数类型语法:

  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语法有效。