У меня проблема с некоторыми запросами к серверу SQL.Оказывается, у меня есть таблица с полями «Attibute_Name» и «Attibute_Value», которые могут быть любого типа, хранящиеся в varchar.(Да ... Я знаю.)
Кажется, что все даты для определенного атрибута хранятся в формате "ГГГГ-ММ-ДД чч: мм: сс" (в этом нет уверенности на 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, а не в предложении select?
Другая подсказка:
Если вместо фильтрации по Attribute_Name я использую фактический Attribute_ID, хранящийся в базе данных (PK), он будет работать без проблем.
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.Мой второй запрос не прошел по той же причине (поскольку атрибуты не были отфильтрованы, преобразование не выполнено при выполнении того же предложения WHERE).Мой третий запрос работал, потому что идентификатор был частью индекса (PK), поэтому он имел приоритет и сначала детализировал результаты по этому условию.
Спасибо!