2017-05-17 7 views
0

SQL Server Expressのselect文で奇妙な問題が発生しています。この動作と同様に正しい動作方法がわかりますそれ。SQLの日付/時刻列の奇妙な動作のクエリを選択します。

私はこのクエリを実行すると、それは私が期待する正確に何を返します。

SELECT 
    Action, TimeOccurred, UserName, IPv4From, ShareName, 
    FullFilePath, NewPathName, FromServer 
FROM 
    File_System_Profiles 
WHERE 
    Action LIKE '%create%' 
    AND (TimeOccurred >= '04/27/2017') 

すべてのこれらのエントリを4月27日とその後何から。

私はこのクエリを実行すると、それは4月27日のエントリは、前のクエリの結果であるため、非常に奇妙である0の結果を返します:私は取り外さすべてが> =と日付の間だった

SELECT 
    Action, TimeOccurred, UserName, IPv4From, ShareName, 
    FullFilePath, NewPathName, FromServer 
FROM 
    File_System_Profiles 
WHERE 
    Action LIKE '%create%' 
    AND (TimeOccurred = '04/27/2017') 

を私は結果が得られません。最初のクエリを実行すると、何かが発生した日付が04/27/2017であることが明確にわかります。最初のクエリがうまくいかなかった場合は、私の日付フォーマットがMM/DD/YYYYで、実際にはYYYY-MM-DD HH:MM:SSのカラムに問題があると仮定しますが、最初のものは論理的に見えます。

答えて

1

日付形式の問題です。あなたが言及したように、"YYYY-MM-DD HH:MM:SS"として日付形式を使用しているので、値"04/27/2017"は比較の際には"04/27/2017 00:00:00"となります。

日付フィールドの値が"04/27/2017 00:00:00"であるレコードがないと仮定します。そのため、=演算子を使用すると、レコードと一致しません。ただし、オペレータ>=は、日付の時:分:秒の部分が存在するレコードを選択します。 「04/27/2017 01:10:00」の例が「04/27/2017 00:00:00」よりも大きいため、>演算子がこれらのレコードをフェッチします。

希望します。

1

まず、常に比較のためにISO標準フォーマットを使用してください。あなたのコードはより次のようになります。ナウマンはTimeOccurredの時間コンポーネントで問題を説明し

where Action LIKE '%create%' AND 
     TimeOccurred = '2017-04-27' 

。これはさまざまな方法で解決できます。 1つの方法は、日付に変換することです。このような何か:

where Action LIKE '%create%' AND 
     cast(TimeOccurred as date) = '2017-04-27' 

データベースによっては、cast()trunc()またはdate_trunc()または何か他のものに置き換えることがあります。

はしかし、私はこのバージョンを好む:

where Action LIKE '%create%' AND 
     TimeOccurred >= '2017-04-27' AND 
     TimeOccurred < '2017-04-28' 

それは問題の核心に取得します。さらに、SQLオプティマイザはインデックスを利用できます。

+0

私はそれが'04/27/2017 00:00:00 'に'04/27/2017'の価値を取っていたとは知らなかったので、私は答えとしてNaumanをマークしました。あなたのお勧めをありがとう、私はあなたの好みの方法に行くつもりだと思うが、私は好きな場合、私はクエリでより細かく得ることができるように日付に加えて時間を含めるだけだと思う​​。 –

関連する問題