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

Откуда:
Сообщений: 1081
 declare @endpoint as date;
 set @endpoint='20190101';



-- ... и тут кусок запроса

 and VsaInform.DPTBG>= @endpoint --- этот падает с ошибкой 

-- Сообщение 241, уровень 16, состояние 1, строка 4
-- Conversion failed when converting date and/or time from character string.

-- да, есть записи с '00000000'

  --and VsaInform.DPTBG>= '20190101' 

-- однако с таким условием не падает


есть ощущение, что когда сервер пытается применить индексы - такая ситуация и проявляется. Что годного почитать на эту тему?
1 фев 19, 16:27    [21799897]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36970
Приводите типы явно, если неявного приведения не замечаете.

and VsaInform.DPTBG>= cast(@endpoint as varchar)
1 фев 19, 16:30    [21799902]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
L_argo
Member

Откуда:
Сообщений: 1212
Какого типа поле DPTBG ?

Почему переменная не DateTime ?
1 фев 19, 16:35    [21799907]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
msLex
Member

Откуда:
Сообщений: 8091
waszkiewicz
 declare @endpoint as date;
 set @endpoint='20190101';



-- ... и тут кусок запроса

 and VsaInform.DPTBG>= @endpoint --- этот падает с ошибкой 

-- Сообщение 241, уровень 16, состояние 1, строка 4
-- Conversion failed when converting date and/or time from character string.

-- да, есть записи с '00000000'

  --and VsaInform.DPTBG>= '20190101' 

-- однако с таким условием не падает



есть ощущение, что когда сервер пытается применить индексы - такая ситуация и проявляется. Что годного почитать на эту тему?




Это не про индексы, это про неявное преобразование типов
https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/data-type-precedence-transact-sql?view=sql-server-2017
https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/data-type-conversion-database-engine?view=sql-server-2017
1 фев 19, 16:35    [21799908]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36970
Вернее, вот так: convert( varchar(8), @endpoint, 112 )
1 фев 19, 16:35    [21799909]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
Konst_One
Member

Откуда:
Сообщений: 11517
DPTBG его преобразовывайте в date/datetime
1 фев 19, 16:38    [21799912]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
msLex
Member

Откуда:
Сообщений: 8091
Konst_One
DPTBG его преобразовывайте в date/datetime


Нельзя, ибо


waszkiewicz
-- да, есть записи с '00000000'
1 фев 19, 16:39    [21799915]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
Konst_One
Member

Откуда:
Сообщений: 11517
declare @t table (d varchar(8) null)
insert into @t(d)
values('20190201'), ('00000000'), (''), (null), ('20181231'), ('12234'), ('dfasdgsa')


select 
	CONVERT(datetime,
	case 
		when ISNULL(t.d, '') = '' OR t.d = '00000000'  OR LEN(t.d) < 8 OR ISNUMERIC(t.d) = 0 then '19000101'
		else t.d 
	END, 112) as [date]
from @t t


допиливайте дальше
1 фев 19, 16:47    [21799926]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
4d_monster
Member

Откуда: Москва
Сообщений: 1613
Konst_One,
А почему нельзя ?
SELECT d, COALESCE(TRY_CONVERT(date, d),'19010101') FROM @t
1 фев 19, 16:54    [21799941]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
zby
Member

Откуда: Мск
Сообщений: 42
Konst_One,

а еще можно
ISDATE()
использовать
1 фев 19, 17:00    [21799944]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1081
declare @endpoint as char(8)

и всего делов
1 фев 19, 17:01    [21799945]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
Konst_One
Member

Откуда:
Сообщений: 11517
waszkiewicz
declare @endpoint as char(8)


и всего делов


ну так и что даст это сравнение?
1 фев 19, 17:04    [21799947]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
Konst_One
Member

Откуда:
Сообщений: 11517
4d_monster
Konst_One,
А почему нельзя ?
SELECT d, COALESCE(TRY_CONVERT(date, d),'19010101') FROM @t


можно всё, ТС не обозначил версию сервера
1 фев 19, 17:04    [21799948]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1081
Konst_One,
DPTBG - varchar(8)
1 фев 19, 17:08    [21799951]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1081
Konst_One,
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) Oct 20 2015 15:36:27 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
1 фев 19, 17:09    [21799952]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
Владислав Колосов
Member

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

элементарно: падает, если сравнивать кривую строку с датой, не падает, если сравнивать кривую строку со строкой.

Сравниваете ежа с цаплей - падает, сравниваете ежа с ежом - не падает.
1 фев 19, 17:09    [21799953]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
Konst_One
Member

Откуда:
Сообщений: 11517
waszkiewicz
Konst_One,
DPTBG - varchar(8)


 declare @endpoint as char(8) = '20190101';
 declare @DPTBG varchar(8) = 'ZZZZZ';

select CASE WHEN @DPTBG >= @endpoint THEN '>=' ELSE '<' END as [case]


???
1 фев 19, 17:12    [21799956]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
waszkiewicz
Member

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

есть еще и бизнес-логика. не будет там невалидных дат ('00000000' - просто эквивалент NULL)
1 фев 19, 17:18    [21799960]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
Владислав Колосов
Member

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

значит используйте nullif(). На сервере, знаете ли, другая логика, отличная от фантастической.
1 фев 19, 22:29    [21800203]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7757
И ещё - не ешьте на ночь сырых помидоров, используйте явное преобразование типов.
1 фев 19, 22:31    [21800204]     Ответить | Цитировать Сообщить модератору
 Re: ткните, где почитать про параметры в предложении where и индексы  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1081
Владислав Колосов
И ещё - не ешьте на ночь сырых помидоров, используйте явное преобразование типов.

сарказм от Остапа Ибрагимовича "здесь неуместен"
моя ошибка была лишь в том, что объявил @endpoint as date. DPTBG живет как varchar(8). Клиент туда в принципе не даст записать что-то отличное от, например '20180101' или '00000000' если дата не выбрана. Это инфа 100500%
2 фев 19, 11:15    [21800343]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить