Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сравнение дат  [new]
Andrew Izvarin
Member

Откуда:
Сообщений: 7
Очень нужна помощь!
У меня есть таблица, в которой один из столбцов типа SQL_VARIANT. Он содержит разную информацию, в том числе и дату. Мне нужно выбрать поля, которые связаны с другой таблицей, а потом из них выбрать те, значения дат которых, к примеру, равны конкретно заданной.

SELECT tbl.f_id, tbl.f_fkHeaderId, tbl.f_fkParameterId, tbl.f_value, tbl.f_prevDataId
FROM (SELECT b.f_id, b.f_fkHeaderId, b.f_fkParameterId, b.f_value, b.f_prevDataId 
	  FROM Repository AS b WHERE (b.f_fkParameterId IN (SELECT a.f_DocParameterId 
          FROM DocumentParameters AS a WHERE a.f_fkParameterId = 162))) AS tbl
WHERE CONVERT(DATETIME, tbl.f_value) = CONVERT(DATETIME, '01-01-1990 00:00:00')

Выдает ошибку, что не может конвертировать из символьной строки в тип время.
Все вроде логично - сначала я выбираю данные из таблицы Repository или b, а потом из выбранного выбираю конкретные значения путем сравнения их с приведением во время. Выбранные данные из таблицы Repository я проверял - содержит ничего лишнего кроме даты. Данные не заходят за границы. Крутить-вертеть с CONVERT() пробовал как угодно - все равно отказывается работать.
Есть какие-нибудь предположения, в чем может быть проблема?
12 авг 09, 17:53    [7529819]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
O_val
Member

Откуда:
Сообщений: 157
автор
данные из таблицы Repository я проверял - содержит ничего лишнего кроме даты.


В каком формате дата?
12 авг 09, 18:03    [7529878]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
для начала найдите то значение, которое не может конвертнуть. а потом думаю все будет ясно.

для спящего время бодрствования равносильно сну
12 авг 09, 18:03    [7529880]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
Andrew Izvarin
Member

Откуда:
Сообщений: 7
O_val, дата в формате гггг-мм-дд чч:мм:сс.ммм
12 авг 09, 18:38    [7530019]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
Andrew Izvarin
Member

Откуда:
Сообщений: 7
Алексей2003,

пытался. я проверял "кривые значения", которые содержит таблица, типа 1900-01-01 00:00:00.000
или 2205-01-01 00:00:00.000
Все остальные значения нормальные, и оно их тоже конвертирует.
Вот только не могу (даже не представляю как) поймать, на каком именно поле оно ругаться начинает
12 авг 09, 18:41    [7530029]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
iljy
Member

Откуда:
Сообщений: 8711
Andrew Izvarin,

думаю ISDATE вас спасет.
12 авг 09, 18:54    [7530068]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
stimpi
Member

Откуда: Киев, Украина
Сообщений: 662
Andrew Izvarin
Вот только не могу (даже не представляю как) поймать, на каком именно поле оно ругаться начинает


через курсор пробегитесь оп записям, и увидите на каких значениях падает, а вообще он должен говорить что-то типа такого
'bla-bla-bla' cannot convert to datetime
и уже искать этот злополучный 'bla-bla-bla'
12 авг 09, 18:56    [7530072]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
stimpi
а вообще он должен говорить что-то типа такого
'bla-bla-bla' cannot convert to datetime
и уже искать этот злополучный 'bla-bla-bla'

не напишет. общая ошибка. можно в профайлере глянуть - включив трассировку, если сервер 2005 и выше. а так курсор или построчный анализ.
12 авг 09, 19:03    [7530089]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
iljy
Member

Откуда:
Сообщений: 8711
Andrew Izvarin,

select f_value from Repository
where ISDATE(Repository) = 0

будет первое приближение.
12 авг 09, 19:11    [7530105]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
Andrew Izvarin
Member

Откуда:
Сообщений: 7
iljy,

ISDATE(f_value) вы имели в виду...
пробовал, только не со всей таблицы (там с десяток лимонов записей), а уже с определенной выборкой полей, которые должны содержать даты. Ну и результата он не выдал, т.е. все поля содержат даты. Однако конвертация загинается
12 авг 09, 19:43    [7530190]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
Andrew Izvarin
Member

Откуда:
Сообщений: 7
Алексей2003,

Попробовал курсором. Походу выпадет прям на первой записи, т.к. выборка из курсора кроме ошибки ничего больше не дала.
12 авг 09, 19:48    [7530200]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2Andrew Izvarin
ну так и сделайте print значения, которое пытаетесь преобразовать в дату. и попробуйте уже это отдельное значение преобразовать.

для спящего время бодрствования равносильно сну
12 авг 09, 19:51    [7530206]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
iljy
Member

Откуда:
Сообщений: 8711
Andrew Izvarin
iljy,

ISDATE(f_value) вы имели в виду...
пробовал, только не со всей таблицы (там с десяток лимонов записей), а уже с определенной выборкой полей, которые должны содержать даты. Ну и результата он не выдал, т.е. все поля содержат даты. Однако конвертация загинается


есть подозрение, что у вас очень характерная ошибка - вы делаете предположение о порядке выполнения сервером операций. Попробуйте заменить условие на
CONVERT(DATETIME, case when ISDATE(tbl.f_value) then tbl.f_value end) =
CONVERT(DATETIME, '01-01-1990 00:00:00')
12 авг 09, 20:01    [7530239]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
Andrew Izvarin
Member

Откуда:
Сообщений: 7
Алексей2003,

Выводил. Выдает ошибку еще на первом FETCH-e. Я попробовал сделать хитро, и написал так:

SELECT f_id, ... , CONVERT(DATETIME, f_value) FROM Repository ...
Только без сравнения дат. Сделал просто выборку. Все работает, ошибок не выдает...
Я уже даже не знаю в чем может быть проблема. Как-бы при выборке оно спокойно конвертонуло все данные, без единой ошибки. А с условием WHERE - ругается.
12 авг 09, 20:08    [7530258]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
Andrew Izvarin
Member

Откуда:
Сообщений: 7
iljy,

Ё-маё!!!! Вы спасли мне жизнь!
Как-то так я уже пробовал делать раньше, но видать не правильно. И кстати я так и думал, что проблема в последовательности выполнения операций. До этого запрос имел немного другой вид, и я его поменял на этот, думая, что он будет работать правильно.
Все работает! Еще раз огромное спасибо!
12 авг 09, 20:14    [7530278]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
iljy
Member

Откуда:
Сообщений: 8711
Andrew Izvarin,

проблема в том, что сервер вычисления над полями проводит когда ему удобно. И ваше условие по сравнению дат он может применять (и наверняка применяет, что легко проверить на плане) непосредственно при выборке данных из Repository, т.е. ДО отбора данных, ДЕЙСТВИТЕЛЬНО имеющих тип дата. А в списке выборки он вычисления выполняет в последний момент, т.е. ПОСЛЕ отбора. И это тоже легко увидеть на плане.
12 авг 09, 20:15    [7530282]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение дат  [new]
iljy
Member

Откуда:
Сообщений: 8711
Andrew Izvarin,

не за что:) но чтобы больше ей (жизнью) не рисковать - учитесь пользоваться поиском, вопросы преобразования типов много раз обсуждались, в том числе и в контексте отбора подходящих для преобразования данных.
12 авг 09, 20:17    [7530286]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить