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

Откуда: Київ
Сообщений: 10428
xp.value sql_variant.

Так выполняется какое-то время потом пишет
Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type datetime.

select xp.value,SQL_VARIANT_PROPERTY(xp.value,'BaseType') as 'BaseType',
datepart(year,convert(datetime,xp.value,121))*10000+
datepart(month,convert(datetime,xp.value,121))*100+
datepart(day,convert(datetime,xp.value,121)),
* 
from  dbo.p
inner join dbo.xp on xp.[id]=p.[id] and p.id='B4AA1B67-1796-4496-8054-35E3DB6B8037'
where 
(datepart(year,convert(datetime,cast(xp.value as datetime),121))*10000+
datepart(month,convert(datetime,cast(xp.value as datetime),121))*100+ 
datepart(day,convert(datetime,cast(xp.value as datetime),121)))>cast('20071122' as int)

Убираю where, выполняю - ошибок нет, и все проперти datetime

select xp.value,SQL_VARIANT_PROPERTY(xp.value,'BaseType') as 'BaseType',
datepart(year,convert(datetime,xp.value,121))*10000+
datepart(month,convert(datetime,xp.value,121))*100+
datepart(day,convert(datetime,xp.value,121)),
* 
from  dbo.p
where p.id='B4AA1B67-1796-4496-8054-35E3DB6B8037'
inner join dbo.xp on xp.[id]=p.[id] and p.id='B4AA1B67-1796-4496-8054-35E3DB6B8037'
19 июн 09, 15:45    [7321463]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
Glory
Member

Откуда:
Сообщений: 104760
А так

select xp.value,SQL_VARIANT_PROPERTY(xp.value,'BaseType') as 'BaseType',
datepart(year,convert(datetime,xp.value,121))*10000+
datepart(month,convert(datetime,xp.value,121))*100+
datepart(day,convert(datetime,xp.value,121)),
* 
from  dbo.xp
19 июн 09, 15:50    [7321503]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
iljy
Guest
Winnipuh,

автор

cast('20071122' as int)



это сначала преобразуется в int, а потом в datetime, вот и переполнение.
а зачем вообще в WHERE вы вот так convert(datetime,cast(xp.value as datetime),121) пишете??
cast(xp.value as datetime) - честное слово - то же самое делает! 8)))

и join - уберите, поставьте просто проверку
xp.[id] = B4AA1B67-1796-4496-8054-35E3DB6B8037'
19 июн 09, 15:53    [7321526]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
А так

select xp.value,SQL_VARIANT_PROPERTY(xp.value,'BaseType') as 'BaseType',
datepart(year,convert(datetime,xp.value,121))*10000+
datepart(month,convert(datetime,xp.value,121))*100+
datepart(day,convert(datetime,xp.value,121)),
* 
from  dbo.xp


так тоже есть ошибка, но это и понятно - в value есть разные типы данных.

В моем случае разница запросов только во where, я упростил даже так

where
convert(datetime,xp.value,121) is not null
and SQL_VARIANT_PROPERTY(xp.value,'BaseType') = N'datetime'

и тоже переполнение...
Но странно то, что в селекте те же преобразования - ошибки нет, а если во where - есть.
19 июн 09, 16:10    [7321666]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Winnipuh

так тоже есть ошибка, но это и понятно - в value есть разные типы данных.

В моем случае разница запросов только во where, я упростил даже так

where
convert(datetime,xp.value,121) is not null
and SQL_VARIANT_PROPERTY(xp.value,'BaseType') = N'datetime'

и тоже переполнение...
Но странно то, что в селекте те же преобразования - ошибки нет, а если во where - есть.

А почему вы считаете, что сервер сначала сделает фильтрацию по where, а только потом будет вычислять значения в select ?
19 июн 09, 16:16    [7321713]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Glory
Winnipuh

так тоже есть ошибка, но это и понятно - в value есть разные типы данных.

В моем случае разница запросов только во where, я упростил даже так

where
convert(datetime,xp.value,121) is not null
and SQL_VARIANT_PROPERTY(xp.value,'BaseType') = N'datetime'

и тоже переполнение...
Но странно то, что в селекте те же преобразования - ошибки нет, а если во where - есть.

А почему вы считаете, что сервер сначала сделает фильтрацию по where, а только потом будет вычислять значения в select ?


если мне надо сделать выборку по данным с датами с использованием
функций для преобразования даты, то я не смогу жтого сделать даже указав
SQL_VARIANT_PROPERTY(xp.value,'BaseType') = N'datetime' ?

т.е. всегда будет ошибка?
19 июн 09, 16:19    [7321742]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Winnipuh

если мне надо сделать выборку по данным с датами с использованием
функций для преобразования даты, то я не смогу жтого сделать даже указав
SQL_VARIANT_PROPERTY(xp.value,'BaseType') = N'datetime' ?

т.е. всегда будет ошибка?

Ошибка пока в том, что вы считаете, что сервер выполнят запрос строго справа налево и снизу вверх
Причем все действия строго друг за другом
А сервер меж тем имеет какую никакую логику и старается оптимизировать действия
И поэтому может менять порядок вычислений
Поэтому думать надо как сервер. И запрос писать подобающе.
19 июн 09, 16:24    [7321786]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
решил...
спасибо!

вот так есть ошибка

where
(datepart(year,convert(datetime,xp.value,121))*10000+
datepart(month,convert(datetime,xp.value,121))*100+ 
datepart(day,convert(datetime,xp.value,121)))>0
and
 SQL_VARIANT_PROPERTY(xp.value,'BaseType') =N'datetime'


так - нету:

where SQL_VARIANT_PROPERTY(xp.value,'BaseType') =N'datetime'
and
(datepart(year,convert(datetime,xp.value,121))*10000+
datepart(month,convert(datetime,xp.value,121))*100+ 
datepart(day,convert(datetime,xp.value,121)))>0
19 июн 09, 16:25    [7321797]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
iljy
Guest
Winnipuh,

я же написал где у вас ошибка!
19 июн 09, 16:25    [7321798]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
iljy
Guest
Winnipuh,

select convert(datetime,cast(cast('20071122' as int) as datetime), 121) 
выполните запрос
19 июн 09, 16:26    [7321806]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
iljy
Winnipuh,

select convert(datetime,cast(cast('20071122' as int) as datetime), 121) 
выполните запрос


ошибка, но я так не делал
19 июн 09, 16:32    [7321867]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
iljy
Guest
Winnipuh
[quot iljy]Winnipuh,

ошибка, но я так не делал


where 
(datepart(year,convert(datetime,cast(xp.value as datetime),121))*10000+
datepart(month,convert(datetime,cast(xp.value as datetime),121))*100+ 
datepart(day,convert(datetime,cast(xp.value as datetime),121)))>
 cast('20071122' as int)

ровно так вы и делали
19 июн 09, 16:33    [7321881]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
iljy
Winnipuh,

автор

cast('20071122' as int)



это сначала преобразуется в int, а потом в datetime, вот и переполнение.
а зачем вообще в WHERE вы вот так convert(datetime,cast(xp.value as datetime),121) пишете??
cast(xp.value as datetime) - честное слово - то же самое делает! 8)))

и join - уберите, поставьте просто проверку
xp.[id] = B4AA1B67-1796-4496-8054-35E3DB6B8037'


это сначала преобразуется в int, а потом в datetime, вот и переполнение

это почему так?

во вхере слева стоит целое число и справа тоже д.б. целое cast('20071122' as int)
19 июн 09, 16:34    [7321887]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
iljy
Winnipuh
[quot iljy]Winnipuh,

ошибка, но я так не делал


where 
(datepart(year,convert(datetime,cast(xp.value as datetime),121))*10000+
datepart(month,convert(datetime,cast(xp.value as datetime),121))*100+ 
datepart(day,convert(datetime,cast(xp.value as datetime),121)))>
 cast('20071122' as int)

ровно так вы и делали


эээ, нет, секудночку:

cast('20071122' as int) - целое
datepart(...)*10000 + datepart(...)*100 + datepart(...) - целое
19 июн 09, 16:36    [7321913]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
iljy
Guest
Winnipuh,

... по идее да, я сейчас еще раз перепроверил. но возможно тут сносит крышу у оптимизатора выражений.
19 июн 09, 16:39    [7321962]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
iljy
Guest
Winnipuh,

вообще у вас условие очень сложное. вот так - не то же самое будет?
where cast(xp.value as datetime) >= '20071123'
19 июн 09, 16:44    [7322024]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Winnipuh,

скажите, а что сервер должен сделать вот здесь?
convert(datetime,cast(xp.value as datetime),121))
?
xp.value преобразуется в datetime, а потом этот datetime преобразуется опять в datetime!
При этом упоминается некий стиль 121, который работает, если преобразование между строкой и датой.
В данном случае этот стиль просто игнорируется.
19 июн 09, 16:45    [7322031]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
iap
Winnipuh,

скажите, а что сервер должен сделать вот здесь?
convert(datetime,cast(xp.value as datetime),121))
?
xp.value преобразуется в datetime, а потом этот datetime преобразуется опять в datetime!
При этом упоминается некий стиль 121, который работает, если преобразование между строкой и датой.
В данном случае этот стиль просто игнорируется.


здесь конечно же лишние пребразования.
19 июн 09, 17:09    [7322258]     Ответить | Цитировать Сообщить модератору
 Re: почему ошибка overflow в запросе?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Winnipuh,

я что-то подзабыл, какой у Вас сервер? На 2008-й не перешли ещё?
19 июн 09, 17:57    [7322579]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить