2012-08-08 38 views
1

我有一個查詢可以獲取昨天的日期結果。我想要做的就是過濾結果更多,只返回結果任何皮奧爾上午6:30或之後7:15 AM。如果結果在6:30和7:15之間,我不關心結果。如何過濾特定時間之前的結果

下面是我的查詢:

SELECT Store_Id, DM_Corp_Received_Date 
FROM Register_Till_Count_Tb 
WHERE (Register_Transaction_Type = 'SOD') 
    AND (Register_Till_Count_Datetime >= DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1, 0)) 
    AND (Register_Till_Count_Datetime < DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)) 

這是輸出:

Store_ID DM_Corp_Received_Date 
1  8/7/2012 5:29 AM 
2  8/7/2012 6:15 AM 
3  8/7/2012 6:29 AN 
4  8/7/2012 5:53 AM 
5  8/7/2012 6:12 AM 
6  8/7/2012 6:23 AM 
7  8/7/2012 6:00 AM 
8  8/7/2012 6:08 AM 
9  8/7/2012 5:39 AM 
10  8/7/2012 6:14 AM 

的其他棘手的部分是上面是在中部時間,我的時區是東部。所以我需要將它轉換爲東方THEN篩選結果。

+0

在我的帖子上面的where語句是抓住YESTERDAYS日期。 「AND」肯定是有效的...我需要添加另一個「AND」語句來搜索TIME EARLIER,然後在6:30 AM和7:15之後... – Shmewnix 2012-08-08 19:02:27

回答

2

嘗試類似下面的代碼。如果按計劃運行,您可能需要弄清楚如何將「現在」的正確值傳遞給查詢。例如,星期一運行看星期日,還是星期五看?

declare 
    @dtNow   datetime , 
    @dtToday  datetime , 
    @dtFrom  datetime , 
    @dtThru  datetime , 
    @dtExcludeFrom datetime , 
    @dtExcludeThru 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) + ' 06:30:00.000' , 120) 
set @dtExcludeThru = convert(datetime, convert(char(10),@dtFrom,120) + ' 07:15:00.000' , 120) 

SELECT Store_Id , 
     DM_Corp_Received_Date 
FROM Register_Till_Count_Tb 
WHERE Register_Transaction_Type = 'SOD' 
    AND Register_Till_Count_Datetime  between @dtFrom  and @dtThru 
    AND Register_Till_Count_Datetime not between @dtExcludeFrom and @dtExcludeThru 

這裏的計算變量值的樣本:

@dtNow   2012-08-08 15:12:46.790 
@dtToday  2012-08-08 00:00:00.000 
@dtFrom  2012-08-07 00:00:00.000 
@dtThru  2012-08-07 23:59:59.997 
@dtExcludeFrom 2012-08-07 06:30:00.000 
@dtExcludeThru 2012-08-07 07:15:00.000 

隨着datetime值,當天的最後一個「滴答」可能會在SQL Server 2000中我不記得23:59:59.996,雖然(因爲我不得不處理它,所以時間太長了)。如果是,您需要將dateadd(ms,-3,...)更改爲dateadd(ms,-4,...)

就時區而言,SQL Server 2000對它們一無所知。對UTC也一無所知。日期時間值只是自1900-01-01T00:00:00.000以來的天數和小數天數。

它代表UTC還是本地時間完全取決於您的系統設置。如果日期/時間值來自用戶或其他系統,則您將依賴於數據源的含義。

就東部標準時間(EST)到中部標準時間(CST)的轉換而言,CST比東部時間早一個小時,因此只需扣除一小時即可獲得EST:dateadd(hour,-1,@my_datetime_value)。如果您必須處理夏令時和標準時間之間的界限,則它會變得更加複雜,因爲您需要知道日期/時間值的來源軌跡,而且很可能,記錄系統是否以任何方式規範日期/時間值。

例如,在2005年之前,印第安納州表面上是在中部時區。但是,中央(UTC-6)或東部(UTC-7)—時區—的選擇以及是否觀察夏令時是以縣爲單位進行的。一些縣喜歡復活節時間。雖然一些縣做了觀察員夏令時,但大部分都沒有。這有效地使這些縣在中部時間和東部時間之間切換,取決於一年中的哪個時間。

2006年,印第安納州通過了一項法律,對東部時區和夏令時進行了標準化處理......除了印第安納州92個縣中的18個縣位於中部時間(西北角7個縣)因爲他們在芝加哥附近,這是中央時間,在國家西南角有11個,因爲他們幾乎沒有任何東西,所以他們只是爲了興奮。然後在2007年3月11日,普拉斯基縣從中部時間改爲復活節時間。不知道印第安納以來他們做了什麼。

更多—多少對處理這類東西的困難更多—,通過Nachum DershowitzEdward M. Reingold參見[優!]書Calendrical Calculations。這本書有其自己的網站:

http://www.cs.tau.ac.il/~nachum/calendar-book/index.shtml

Calendrical Calculations Cover

如果我去接近這個問題,我會設計一些類型的映射表或表來讓我看看了適當調整給出一個日期/時間值和一個類似於郵政編碼或基地郵政編碼的軌跡。美國郵政編碼的前3位數字爲您提供城市或地區的基本郵政編碼。例如,西雅圖的基本郵編是98100.

查找要在表格中隨時間加載時區使用情況的數據,是否在該位置觀察到夏令時,如果是,那麼切換日期在每個地點的特定年份或年份範圍內可能是一種挑戰。

+0

此存儲過程在SQL-Server2000中不起作用 – Shmewnix 2012-08-08 21:39:27

+0

@Shmewnix:Eh?我必須處理SQL Server 2000已有數年了,但我不相信我正在做任何SQL Server 2000不知道的關於T-SQL的WRT。不過,編輯添加了兩個缺失的變量聲明。 – 2012-08-08 22:19:12

+0

這很好用!我有點模糊瞭如何處理時間轉換...我最初的想法是首先將DM_Corp_Receive_Date列轉換爲東部時間(我需要添加一小時),我可以在查詢中執行如下操作:SELECT Store_Id, DM_Corp_Received_Date as(dateadd(hour,+ 1,@ My_date_time))顯然這不起作用......我對如何添加小時數有些困惑。我需要顯示實際打開的時間(東部時間不是中央)。 – Shmewnix 2012-08-09 13:36:11

1

您可以使用BETWEEN功能。例如

SELECT value 
FROM table 
WHERE date_col NOT BETWEEN '2012-08-08 06:30' AND '2012-08-08 07:15' 

將時間轉換到東部,你可以改變你的過濾器(加一小時),也可以使用

DATEADD(hh,-1,date_col) 

這將基本上每個日期減去一個小時。顯然,更改1日期會比更改表格中的所有日期更快,因此只更改過濾日期會更有效。

如果您還有其他問題,或許您可以發佈更多信息。

+0

問題是我正在爲Yesterdays日期運行查詢。 (這將在一個由Windows調度程序運行的程序中),所以我總是需要「Yesterdays」日期。 – Shmewnix 2012-08-08 19:29:49

相關問題