2012-08-10 98 views
0

我有一個程序可以自動運行Windows調度程序。該程序運行一個使用Yesterdays日期的存儲過程,對我們的數據庫運行查詢以從前一天中提取結果。此查詢排除整個一天的特定時間段,因爲我們不關心這些結果。但是,我們在星期天有不同的時間,並且想要更改星期天的查詢......如果是「星期天」,有什麼不同的查詢方法嗎?下面是我的存儲過程:如何根據星期幾運行不同查詢

CREATE PROCEDURE [dbo].[sp_Open_Close_Report_1] AS 
declare @dtNow   datetime , @dtToday  datetime , @dtFrom  datetime , @dtThru  datetime , @dtExcludeFrom datetime , @dtExcludeThru datetime, @dtExcludeEOD datetime 
set @dtNow   = getdate() 
set @dtToday  = convert(datetime,convert(varchar,@dtNow,112),112) 
set @dtFrom  = dateadd(day,-1,@dtToday) -- start-of-day yesterday 
set @dtThru  = dateadd(ms,-3,@dtToday) -- end-of-day yesterday (e.g., 2012-06-17 23:59:59.997) 
set @dtExcludeFrom = convert(datetime, convert(char(10),@dtFrom,120) + ' 05:30:00.000' , 120) 
set @dtExcludeThru = convert(datetime, convert(char(10),@dtFrom,120) + ' 06:15:00.000' , 120) 
set @dtExcludeEOD = convert(datetime, convert(char(10),@dtFrom,120) + ' 08:00:00.000' , 120) 


SELECT Store_Id , DM_Corp_Received_Date, Register_Transaction_Type 
FROM Register_Till_Count_Tb 
WHERE (Register_Transaction_Type = 'SOD' and store_ID = '12345' 
AND DM_Corp_Received_date  between @dtFrom   
and @dtThru 
AND DM_Corp_Received_date not between @dtExcludeFrom 
and @dtExcludeThru) or (Register_Transaction_Type = 'EOD' and Store_ID='12345' 
AND DM_Corp_Received_date Between @dtFrom and @dtThru) 

上週日的@DTExclude從將是6:30和@dtexcludeThru將是7:15

+0

您是否考慮過使用SQL Server代理?它可能會爲您提供更多的粒度和控制。 – 2012-08-10 13:28:46

+0

你有很多不必要的日期 - >字符串 - >日期轉換。如果你需要捕獲整整一天,那麼通常使用* exclusive *結束日期並避免使用'BETWEEN',這樣做也可以避免將來的問題,如果你移動到'datetime2',那麼毫秒級的精度就會更高。 – 2012-08-10 13:29:27

+0

我不能,它是SQL Server 2000,並且在2000年通過服務器代理髮送電子郵件的方法並不簡單 – Shmewnix 2012-08-10 13:30:24

回答

2

讓我們做更多的數學藏在心裏的日期時間(或整數),而不是擺弄字符串:

declare @dtNow   datetime , @dtToday  datetime , @dtFrom  datetime , @dtThru  datetime , @dtExcludeFrom datetime , @dtExcludeThru datetime, @dtExcludeEOD datetime 
set @dtNow   = getdate() 
set @dtToday  = DATEADD(day,DATEDIFF(day,0,@dtNow),0) 
set @dtFrom  = dateadd(day,-1,@dtToday) 

declare @Sunday int 
set @Sunday = CASE WHEN DATEPART(weekday,@dtFrom) = DATEPART(weekday,'20120805') THEN 1 ELSE 0 END 
set @dtExcludeFrom = DATEADD(minute,330 + @Sunday * 60,@dtFrom) 
set @dtExcludeThru = DATEADD(minute,375 + @Sunday * 60,@dtFrom) 
set @dtExcludeEOD = DATEADD(minute,480,@dtFrom) 

而且,您的查詢,而不是:

column between @dtFrom and @dtThru 

使用:

column >= @dtFrom and column < @dtToday 
+0

你定義'20120805'這個程序將每年365天運行...所以一個星期天的定義日期不會對我有任何好處... – Shmewnix 2012-08-10 13:38:20

+0

@Shmewnix - 我正在檢查一週中的「 @ dtFrom'與20120805(已知週日)的一週中的某一天相同。它避免了必須考慮不同的'DATEFIRST'和語言設置。 – 2012-08-10 13:39:31

+0

有趣...處理這種方式。我喜歡。讓我玩吧。 – Shmewnix 2012-08-10 13:41:32

0

看看在datenamedatepart功能。您可以使用if語句根據當天的情況執行不同的邏輯。當上週日運行,它們將產生以下結果:

select datename(dw, getdate()) -- Sunday 
select datepart(dw, getdate()) -- 1 
+0

@AaronBertrand好趕上,這就是我得到的複製/粘貼到另一個匆忙的一條線.. – goric 2012-08-10 13:36:10

+0

「當在星期天運行...」當語言是英語,和'DATEFIRST '沒有被設置爲果味價值...... – 2012-08-10 13:43:31

+0

@Damien_The_Unbeliever基於問題中的代碼,我假設英語很好。我沒有意識到'DATEFIRST',我必須閱讀。 – goric 2012-08-10 13:50:06

相關問題