一部のSQLサーバーのクエリに問題があります。私は、 "Attibute_Name"と "Attibute_Value"フィールド(varcharに格納されている任意のタイプ)のテーブルを持っていることがわかります。 (ええと...知っている)datetimeへの変換はWHERE句でのみ失敗しますか?
特定の属性のすべての日付は、「YYYY-MM-DD hh:mm:ss」形式で格納されているようです(100%ここでは、レコード)のので、私は問題もなく、このコードを実行することができます
select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from
ProductAttributes pa
inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where
a.Attribute_Name = 'SomeDate'
をしかし、私は次のコードを実行した場合:
select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from
ProductAttributes pa
inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where
a.Attribute_Name = 'SomeDate'
and CONVERT(DATETIME, pa.Attribute_Value) < GETDATE()
を私は次のエラーが発生します。変換するとき 、変換に失敗しました文字列からの日付および/または時刻。
どのようにしてwhere句で失敗し、選択したもので失敗しますか?私はデータベース(PK)に格納されている実際のATTRIBUTE_IDそれは問題なく動作しますを使用することによりATTRIBUTE_NAME
場合は代わりのフィルタリング:
もう一つの手がかり。答えを
select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from
ProductAttributes pa
inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where
a.Attribute_ID = 15
and CONVERT(DATETIME, pa.Attribute_Value) < GETDATE()
更新 みんなありがとう。誰もが問題を理解するのに役立つ何かを指摘したので、正解を実際に選ぶのは難しいと感じました。それは間違いなく実行の順序と関係がありました。 WHERE句が最初に実行され、次にSELECTが実行されたため、最初のクエリが正しく機能していました。 同じ理由で2番目のクエリが失敗しました(属性がフィルタされなかったため、同じWHERE句を実行している間に変換に失敗しました)。 IDがインデックス(PK)の一部であるため、3番目のクエリが機能したため、優先順位が高くなり、最初にその条件の結果がドリルダウンされました。
ありがとうございます!
'sOmeDaTe'と呼ばれる別の属性はありませんしながら、
そのノートオン、EAVを取り除くことをお勧めでしょうか?おそらくそれはあなたの結合を台無しにするでしょう。 – YetAnotherUser
'WHERE'節で述語の短絡評価や保証された順序付けを仮定しているようです。これは保証されていません。そのようなカラムにデータ型を混在させた場合、それらを扱う唯一の安全な方法は 'CASE'式です。 –
PHAとは何ですか? PHAがPAとは異なるテーブルである場合、PHAのデータには変換不可能なレコードが存在するように見えますが、PAの場合と異なります。 – N0Alias