1

昨日の日付から結果を取得するクエリがあります。私がやりたいことは、午前 6 時 30 分または午前 7 時 15 分以降の結果のみを返すことによって、結果をさらにフィルタリングすることです。結果が午前 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

その他のトリッキーな部分は、上記が中央時間で、私のタイムゾーンは東部です. だから私はそれを東部に変換する必要があり、結果をフィルタリングします。

4

2 に答える 2

2

次のコードのようなものを試してください。スケジュールに従って実行している場合は、「now」の正しい値をクエリに渡す方法を理解する必要がある場合があります。たとえば、月曜日の実行は日曜日を見ますか、それとも金曜日を見ますか?

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すると、その日の最後の「目盛り」が23:59:59.996SQL Server 2000にある可能性があります。ただし、覚えていません(対処しなければならなかったため、長すぎました)。dateadd(ms,-3,...)そうである場合は、に変更する必要がありますdateadd(ms,-4,...)

タイムゾーンに関する限り、SQLServer2000はタイムゾーンについて何も知りません。UTCについても何も知りません。日時の値は、1900-01-01T00:00:00.000のエポックからの日数と小数日数です。

UTCを表すか現地時間を表すかは、システムの設定方法に完全に依存します。日付/時刻の値がユーザーまたは他のシステムからのものである場合、意味はデータソースに依存しています。

東部標準時(EST)から中部標準時(CST)に変換する限り、CSTは東部標準時より1時間早いので、1時間を引くだけでESTを取得できdateadd(hour,-1,@my_datetime_value)ます。夏時間(夏時間)と標準時の境界に対処する必要がある場合は、日付/時刻の値のソース軌跡を知る必要があるため、[はるかに]複雑になります。記録システムが日付/時刻の値を正規化したわけではありません。

たとえば、2005年以前は、インディアナ州は中部標準時でした。ただし、タイムゾーン(中央(UTC-6)または東部(UTC-7))の選択、および夏時間が観察されたかどうかは、郡ごとに行われました。一部の郡はイースタータイムが好きでした。一部の郡では夏時間を採用しましたが、ほとんどの郡では夏時間を採用しませんでした。これにより、これらの郡は、1年のどの時期に応じて、中部標準時と東部標準時の間で効果的に切り替わりました。

2006年、インディアナ州は東部時間帯と夏時間の観測に関する法律と[一種の]標準化を可決しました...インディアナ州の92の郡のうち18が中央時間にあることを除いて(州の北西隅にある7つ。それらは、中央時間であるシカゴの近くにあり、州の南西の隅にある11ですが、ほとんど何もないので、ただの飾りです)。そして2007年3月11日、プラスキー郡は中部標準時からイースター時間に変更されました。それ以来、インディアナが何をしてきたのかわかりません。

この種のものを扱うことの難しさについての詳細は、[excellent!]の本NachumDershowitzEdwardM.ReingoldによるCalendricalCalculationsを参照してください。この本には独自のWebサイトがあります。

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

カレンダー計算カバー

その問題に取り組む場合は、ある種のマッピングテーブルを設計して、日付/時刻の値と郵便番号や基本郵便番号などの場所を指定して、適切な調整を行うことができるようにします。米国の郵便番号の最初の3桁は、都市または地域の基本郵便番号を示します。たとえば、シアトルのベースzipは98100です。

時間の経過に伴うタイムゾーンの使用状況、その場所で夏時間が観察されたかどうか、および観察された場合は、各場所の特定の年または年の範囲の切り替え日がどのようなものであったかについて、テーブルにロードするデータを見つける何か挑戦になること。

于 2012-08-08T19:51:12.270 に答える
1

BETWEEN 関数を使用できます。例えば

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

時間を東部に変換するには、フィルターを変更する (1 時間を追加する) か、次を使用できます。

DATEADD(hh,-1,date_col)

これは、基本的に各日付から 1 時間を減算します。明らかに、テーブル内のすべての日付を変更するよりも 1 つの日付を変更する方が迅速であるため、フィルターの日付を変更するだけでより効率的になります。

さらに質問がある場合は、さらに情報を投稿できるかもしれません。

于 2012-08-08T19:26:16.460 に答える