У меня проблема с некоторыми запросами к 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), поэтому он имел приоритет и сначала детализировал результаты по этому условию.
Спасибо!
sOmeDaTe
- если вы используете сортировку без учета регистра? Наверное, это испортило твои соединения. - person YetAnotherUser   schedule 01.09.2011WHERE
. Это не гарантируется. Когда вы используете смешанные типы данных в таком столбце, единственный безопасный способ справиться с ними - использовать выражениеCASE
. - person Martin Smith   schedule 01.09.2011VARCHAR
для хранения значений даты / времени, любой желающий может хранить там любой старый мусор, который ему нужен. Для EAV я всегда предпочитал разделять их на соответствующие столбцы по крайней мере для трех базовых типов, строкового атрибута, атрибута даты / времени и числового атрибута. Это не идеально и не является бесплатным компромиссом, но у вас есть гораздо больше шансов гарантировать, что недействительные данные не попадут в вашу базу данных. - person Aaron Bertrand   schedule 01.09.2011Attribute_Value
не содержит дат, вы преобразуете этот столбец в дату. Вы должны верить, что какая-то предварительная фильтрация гарантирована. - person Martin Smith   schedule 01.09.2011