2017-01-07 12 views
0

から最後の2時間にレコードを取得する私は、日(2017年1月7日)と時刻(午後11時58分06秒PM)2つの列を持って、私は以下のクエリどのようにSQL Serverの

SELECT * FROM Report WHERE Time > DATEADD(HOUR, -2, GETDATE()) 

時間を試してみましたNVARCHAR、日付は日付です

しかし、私はエラーが発生しました "文字列から日付や時間を変換すると変換に失敗しました。"

私はこの解決を手伝ってください!私はSQLのスターターです

+4

'Time'欄で何のデータ型? DDL /スキーマを表示することができますか? – dlatikay

答えて

0

時間はTEXTフィールドと思われます。

日付と時刻を組み合わせてDateTimeフィールドを取得し、それをWHERE句で使用することを検討する必要があります。 SOで

この答えは助けることができる:https://stackoverflow.com/a/7289875/3270427

SELECT * 
FROM Report 
WHERE CAST(Date AS DATETIME) + CAST(Time AS DATETIME) >= DATEADD(HOUR, -2, GETDATE()); 
+0

私は時間列をNVARCHARとして使用していますが、AM/PMの両方が含まれています。 –

+0

あなたの提案によると、私は日付と時刻のフィールドを組み合わせたので、今このクエリはうまくいっています...!ありがとうございました..! –

1

あなたがしたいことはそれらを一緒に追加し、日付を取得することです。残念ながら、datetimeを一緒に追加することはできません。うれしいことに、datetimetimeを一緒に追加できます。 PMが重複し、その後time、の一部である場合、

WHERE (CAST(date as datetime) + CAST(time as time)) >= DATEADD(HOUR, -2, GETDATE()) 

をまたは:

ので:timeが文字の

WHERE (CAST(date as datetime) + time) >= DATEADD(HOUR, -2, GETDATE()) 

場合は、そのだけでなく変換することができる必要があります:

WHERE (CAST(date as datetime) + CAST(LEFT(time, 8) as time)) >= DATEADD(HOUR, -2, GETDATE()) 

残念ながら、これはインデックスを使用しません。しかし、1つの簡単な方法は、計算列やインデックスを使用することです:

alter table report add datetimecol as (CAST(date as datetime) + time); 
create index idx_report_datetimecol on report(datetimecol); 

はEDIT:

あなたのデータに問題があるように見えます。試してみてください:

select time 
from report 
where try_convert(time, timecol) is null; 

か:

select time 
from report 
where try_convert(time, left(timecol, 8)) is null; 

日付列も(ネイティブデータ型を使用しないように本当に悪いアイデア)文字列であれば、同様ことをテストします。

+0

貴重なご回答ありがとうございますが、このエラー(テーブル 'レポート'の列 'datetimecol'はインデックスや統計情報、または非決定論的なためパーティションキーとして使用できません)と同じエラーが表示されます。テーブルはスクリプトを使用して連続的に5分ごとに更新していますので、私がしていたのは、最後の2時間レポートを表示するためにトップ300行を選択したことです。 –

+0

@ T.Anand。 。 。少なくとも、組み込みデータ型を使用するための教訓を学んでいます。彼らは理由のためにそこにいます。これで、構造化されていない文字列を検索する必要があります。 –

関連する問題