テーブルの各行の varChar 列に、この形式の日付/時刻が格納されています: 2013-05-26 20:22:07.2894。
この列を T_SQL WHERE ステートメントで使用して、過去 1 時間分の行を取得するにはどうすればよいでしょうか?
WHERE Time_Stamp > '2013-05-26 18:00:00:0000' ただし、日付/タイをハードコーディングするのではなく、T-SQL を自動的に動作させたいと考えています。
テーブルの各行の varChar 列に、この形式の日付/時刻が格納されています: 2013-05-26 20:22:07.2894。
この列を T_SQL WHERE ステートメントで使用して、過去 1 時間分の行を取得するにはどうすればよいでしょうか?
WHERE Time_Stamp > '2013-05-26 18:00:00:0000' ただし、日付/タイをハードコーディングするのではなく、T-SQL を自動的に動作させたいと考えています。
これはサージ可能なアプローチです(つまり、インデックスを使用します):
where Time_Stamp > convert(varchar(255), getdate() - 1.0/24, 121)
を に変換するVARCHAR
にはDATETIME
、次を使用します。
CONVERT(DATETIME, SUBSTRING(myDate, 1, 23), 121);
... myDate は列名です。日時に変換すると、 との比較GETDATE()
は簡単です。
Datediff(hour, time_stamp, getdate()) < 1
しかし、そのタイムスタンプを varchar として格納する際に間違いを犯している可能性があります。varcharとして保存すると、SQLはテーブルのすべての候補行をチェックしてレコードを見つける必要がありtimestamp
、レコードを識別できるようにするために、すべての値を日付変更線に変換する必要があります探しています。クエリの条件が、ほんの一握りのレコードをチェックするだけで済むようになっていることを願っています。
しかし実際には、日付を文字列として保存する理由はありません。それらを datetime として格納すると、使用するスペースが少なくなり、クエリが高速になり、SQL がより適切なクエリ プランを選択できるようになる可能性があります。サーバーから値の性質を隠すことは、サーバーがあなたを助けることを妨げるだけであり、フィールド値が「2013-05-26 18:00:00:0000」ではなく「Hello」である場合に何が起こるか心配する必要があります' 日付を Datetime として保存し、適切なインデックスを作成する必要があります (必要なインデックスの詳細には、提供したものよりも多くのシステムに関する情報が必要です)。
と組み合わせgetdate()
てdateadd()
、現在の時刻から 1 時間を減算できます。
WHERE Time_Stamp > dateadd(hour, -1, getdate())
datetimeの方が優先順位が高いため、比較のためにvarchar
に変換されます。datetime