我有一个简单的查询,可以获取当天的付款报告。我想自动发送这个每晚发送,但我希望报告每天上午12:00 AM - 晚上11:59运行...我将在晚上9:00发送报告,所以我想它如果这更容易,只需要到晚上9点才能到达。
这是我的问题:
SELECT COUNT(*) AS Number, SUM(dblPayoutAmt) AS Amount
FROM Payouts
WHERE (dtCreated BETWEEN @startdate AND @enddate)
答案 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语法有效。