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

select cast(_DateBegin as numeric(28,22)) 'a' from _T

-32027.7652007716060000000000

при попытке его отобразить возникает ошибка переполнения:

An error occurred while executing batch. Error message is: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.


собственно вопрос:
- как могло сохранится значение выходящее за диапазон данных, почему не возникло ошибки?
- как будет выглядеть диапазон доступен для datetime в формате numeric(28,22)?
23 июн 09, 16:33    [7334170]     Ответить | Цитировать Сообщить модератору
 Re: overflow в datetime  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
а что выдаст
select cast(_DateBegin as binary(8)) 'a' from _T
?

и еще
select @@version
23 июн 09, 16:40    [7334227]     Ответить | Цитировать Сообщить модератору
 Re: overflow в datetime  [new]
Cat7
Guest
вот такие результаты:

select @@version

Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)


select cast(_DateBegin as numeric(28,22)) 'a',
 cast(_DateBegin as varchar) 'b',
 cast(_DateBegin as varbinary) 'c'
 from _T

a
-----------------------------------
-32027.7652007716060000000000

b
-----------------------------------
Nov 11 1811 7:52PM

c
-----------------------------------
0xFFFF823FFF47A76C
23 июн 09, 16:53    [7334296]     Ответить | Цитировать Сообщить модератору
 Re: overflow в datetime  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> собственно вопрос:
> - как могло сохранится значение выходящее за диапазон данных, почему не
> возникло ошибки?

могло. вот, например, почитайте обсуждение:
https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=368599

то есть, хотя сервер и проверяет соответствие значения диапазону
при парсинге констант или при конвертации типов, на самом деле при
передаче значения как параметра туда можно, видимо, запихнуть чуть ли
не все, что угодно (проверка если и делается, то не самим сервером, а
только соответствующим механизмом доступа - odbc, ado или что там).

> - как будет выглядеть диапазон доступен для datetime в формате
> numeric(28,22)?

а смысл именно в numeric(28,22) ? datetime - это ни разу не numeric.

в 2005-ом для отлова таких ошибок есть специальная опция у dbcc checkdb - DATA_PURITY
http://support.microsoft.com/kb/923247

Posted via ActualForum NNTP Server 1.4

23 июн 09, 17:01    [7334338]     Ответить | Цитировать Сообщить модератору
 Re: overflow в datetime  [new]
iljy
Guest
Cat7
вот такие результаты:

select cast(_DateBegin as numeric(28,22)) 'a',
 cast(_DateBegin as varchar) 'b',
 cast(_DateBegin as varbinary) 'c'
 from _T

a
-----------------------------------
-32027.7652007716060000000000

b
-----------------------------------
Nov 11 1811 7:52PM

c
-----------------------------------
0xFFFF823FFF47A76C

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

Откуда: Винница
Сообщений: 22552
Дата и время (Transact-SQL)
Значения типа datetime хранятся внутри компонента SQL Server 2005 Database Engine в виде 4-байтовых целых чисел.
Первые четыре байта содержат количество дней до или после даты отсчета: 1 января 1900 года.
Дата отсчета является системной датой. Вторые четыре байта содержат текущее значение времени,
представленного в виде трехсотых долей секунды, прошедших после полуночи.
Взято отсюда
(там кстати и про диапазоны допустимых значений тоже есть)

А у Вас во вторых 4 байтах отрицательное число, чего быть не может
считаю, что это явный мусор
(сам с таким не сталкивался, ничего более сказать не могу)
23 июн 09, 17:20    [7334434]     Ответить | Цитировать Сообщить модератору
 Re: overflow в datetime  [new]
Cat7
Guest
>Паганель, daw
спасибо, буду разбираться


>iljy
означенная ошибка возникает при такой команде

select _DateBegin from _T
23 июн 09, 17:44    [7334559]     Ответить | Цитировать Сообщить модератору
 Re: overflow в datetime  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Паганель
Дата и время (Transact-SQL)
Значения типа datetime хранятся внутри компонента SQL Server 2005 Database Engine в виде 4-байтовых целых чисел.
Первые четыре байта содержат количество дней до или после даты отсчета: 1 января 1900 года.
Дата отсчета является системной датой. Вторые четыре байта содержат текущее значение времени,
представленного в виде трехсотых долей секунды, прошедших после полуночи.
Взято отсюда
(там кстати и про диапазоны допустимых значений тоже есть)

А у Вас во вторых 4 байтах отрицательное число, чего быть не может
считаю, что это явный мусор
(сам с таким не сталкивался, ничего более сказать не могу)
Но если 0 - это '19000101', то всё, что раньше, должно иметь отрицательное значение? Например, '17530101'? Или, как здесь, '18111111 19:52:00'?
23 июн 09, 17:48    [7334574]     Ответить | Цитировать Сообщить модератору
 Re: overflow в datetime  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Cat7
>Паганель, daw
спасибо, буду разбираться


>iljy
означенная ошибка возникает при такой команде

select _DateBegin from _T
А если так
select CAST(_DateBegin AS DATETIME) from _T
?
23 июн 09, 17:49    [7334579]     Ответить | Цитировать Сообщить модератору
 Re: overflow в datetime  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
iap,

я говорил
Паганель
во вторых 4 байтах отрицательное число
23 июн 09, 17:50    [7334587]     Ответить | Цитировать Сообщить модератору
 Re: overflow в datetime  [new]
Cat7
Guest
iap
А если так
select CAST(_DateBegin AS DATETIME) from _T
?


такая же ошибка
23 июн 09, 18:12    [7334722]     Ответить | Цитировать Сообщить модератору
 Re: overflow в datetime  [new]
iljy
Guest
Cat7

>iljy
означенная ошибка возникает при такой команде

select _DateBegin from _T


понятно... да, значит ошибочные данные записаны. но при этом - в строку она их конвертит, и
select cast ( cast(-32027.7652007716060000000000 as numeric (28,22)) as datetime)
значение тоже выдает, правда другое. посмотрите, какое правильно - и
update _T set _DateBegin = cast(_DateBegin as (numeric либо varchar))
23 июн 09, 19:59    [7335058]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить