2012-12-19 23 views
4

我有一個簡單的查詢,可以爲我們的一天提供付款報告。我希望自動將其發送到每晚,但是我希望報告能夠在當天12:00 AM - 11:59 PM每天運行...我將在晚上9:00發送報告,所以我想它如果更容易,只需要到晚上9點。如何針對「今日」日期從上午12:00至下午11:59運行查詢

這裏是我的查詢:

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

你的絆腳石是什麼?你有查詢在那裏。傳遞參數? – Sam

+0

是的,我希望變量消失,並且總是運行「TODAYS」日期。因此,例如,這將是一個通過Windows調度程序運行的程序,我希望查詢能夠獲取當天的信息,然後我的程序會將它放入一個表中併發送出去。 – Shmewnix

回答

5

不要之間使用的,使用> =開始日期和<一天過去的結束日期:

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

的原因是意志之間直到結束日期的中午12點結束,但不會過去。

修訂

對於今天的日期,你可以這樣做:

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

這將檢查它今天dtCreated等於某個時候了。

修訂

由於@ScottChapman已經指出的那樣,你可以通過轉換成直接DATE類型離不開轉換體操一樣的東西。但是,此類型僅在MSSQL 2008及更高版本中可用。

+0

我不想使用變量,我正在尋找替換'@startdate'和'@enddate' – Shmewnix

+0

所以你想要今天的日期? – PinnyM

+0

是的,它會再次自動化,所以當我明天運行它時,我需要明天的日期等。 – Shmewnix

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

你正在採取11:59太字面methinks :)我想我不能給你什麼要求給你錯...... – PinnyM

0

在先的答案還包括數據< 12.00

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

有些答案是接近,但在當天的最後一分鐘排除時候,如下午11點59分三十〇秒。此查詢將包括所有的今天:

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中添加作爲你使用SQL 2008

1

/Server 2008中,您可以通過將DATETIME列中的任何時間元素轉換爲DATE並從中選擇該元素,例如:

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

非常更優雅

[編輯] 哦,我剛讀斯科特·查普曼的答案,這是更好,因爲如果dtCreated被索引,則查詢的效率會更高。

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'

或者使用功能類型的語法:

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語法起作用。

相關問題