嘗試類似下面的代碼。如果按計劃運行,您可能需要弄清楚如何將「現在」的正確值傳遞給查詢。例如,星期一運行看星期日,還是星期五看?
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 Dershowitz和Edward M. Reingold參見[優!]書Calendrical Calculations。這本書有其自己的網站:
http://www.cs.tau.ac.il/~nachum/calendar-book/index.shtml
如果我去接近這個問題,我會設計一些類型的映射表或表來讓我看看了適當調整給出一個日期/時間值和一個類似於郵政編碼或基地郵政編碼的軌跡。美國郵政編碼的前3位數字爲您提供城市或地區的基本郵政編碼。例如,西雅圖的基本郵編是98100.
查找要在表格中隨時間加載時區使用情況的數據,是否在該位置觀察到夏令時,如果是,那麼切換日期在每個地點的特定年份或年份範圍內可能是一種挑戰。
在我的帖子上面的where語句是抓住YESTERDAYS日期。 「AND」肯定是有效的...我需要添加另一個「AND」語句來搜索TIME EARLIER,然後在6:30 AM和7:15之後... – Shmewnix 2012-08-08 19:02:27