Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 yyyymmdd  [new]
malyan
Member

Откуда:
Сообщений: 48
Почему сервер может ругаться на несоответствие типов, если я в хранимую процедуру параметру datetime пытаюсь передать строковое значение 'yyyymmdd'



Ευχαριστώ εκ των προτέρων!
28 окт 09, 09:15    [7847557]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
Supra93
Member

Откуда:
Сообщений: 8174
магнитные бури?
меня стороной обошли
CREATE PROCEDURE TEST @D DATETIME
AS
SELECT @D
GO
EXEC TEST '20091028'
GO
DROP PROCEDURE TEST
2009-10-28 00:00:00.000
28 окт 09, 09:24    [7847591]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
daw
Member

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

> Почему сервер может ругаться на несоответствие типов, если я в хранимую
> процедуру параметру datetime пытаюсь передать строковое значение 'yyyymmdd'

приведите оригинальное сообщение об ошибке, текст процедуры и ее вызова.

Posted via ActualForum NNTP Server 1.4

28 окт 09, 09:26    [7847606]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
А какой дате соответствует строка 'yyyymmdd'?
28 окт 09, 09:30    [7847615]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
Владимир Сосницкий
Member

Откуда: Запорожье, Украина
Сообщений: 12
курить доку надо вот тут -http://msdn.microsoft.com/ru-ru/library/ms187928.aspx
CONVERT
28 окт 09, 13:49    [7849929]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31219
Владимир Сосницкий
CONVERT
формат yyyymmdd можно использовать без CONVERT, он всегда преобразуется правильно
28 окт 09, 14:11    [7850129]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
alexeyvg
Владимир Сосницкий
CONVERT
формат yyyymmdd можно использовать без CONVERT, он всегда преобразуется правильно
Только надо не забывать заменять буквы на цифры.
И не пытаться передать строковое значение 'yyyymmdd'!
28 окт 09, 14:20    [7850216]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
Влом регистрироваться
Guest
alexeyvg,

не всегда, такое преобразование non-determenistic.
28 окт 09, 14:31    [7850300]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
daw
Member

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

> не всегда, такое преобразование non-determenistic.

а пример можно?

Posted via ActualForum NNTP Server 1.4

28 окт 09, 14:42    [7850377]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
BOL
В SQL Server 2005 и более поздних версиях некоторые преобразования типа данных datetime являются недетерминированными.
В SQL Server 2000 преобразования строковых значений в значения date и time помечаются как детерминированные. Однако это неверно для стилей, перечисленных в следующей таблице. Преобразования для этих стилей зависят от настроек языка. В SQL Server 2005 и последующих версиях эти преобразования помечаются как недетерминированные.

Следующая таблица содержит стили, для которых преобразование строк в тип datetime недетерминировано.

Все стили меньше 1001 106
107 109
113 130

1 За исключением стилей 20 и 21.
28 окт 09, 14:57    [7850519]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
'YYYYMMDD' - это 112-й стиль.
28 окт 09, 14:58    [7850529]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
Влом регистрироваться
Guest
iap,

а вывод?


Пример:

SELECT YEAR('20090101')

Результат:

-----------
2009

Еще пример:

CREATE TABLE #test
(
	ID INT NOT NULL PRIMARY KEY,
	[Value] AS (YEAR('20090101')) PERSISTED NOT NULL
)

Результат:

Msg 4936, Level 16, State 1, Line 1
Computed column 'Value' in table '#test' cannot be persisted because the column is non-deterministic.
29 окт 09, 12:40    [7855223]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
Влом регистрироваться
Guest
Влом регистрироваться,

ах, да, сиквел 2005.
29 окт 09, 12:45    [7855260]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
daw
Member

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

2 Влом регистрироваться

э, нет, вы возражали на высказывание:

> формат yyyymmdd можно использовать без CONVERT, он всегда преобразуется правильно

вот и приведите пример, когда строка в таком формате может интерпретироваться по-разному.
то, что сервер любое преобразование строки в дату без указания стиля считает
недетерминированным - это уже второй вопрос.

Posted via ActualForum NNTP Server 1.4

29 окт 09, 12:52    [7855332]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
Влом регистрироваться
Guest
daw,

дык я привел, не так ли?
29 окт 09, 12:56    [7855364]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
daw
Member

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

> дык я привел, не так ли?

я не вижу примера, в котором строка типа yyyymmdd воспринималась бы по-разному, в зависимости
от каких-то условий.
было утверждение

> формат yyyymmdd можно использовать без CONVERT, он всегда преобразуется правильно

было ваше возражение:

> не всегда, такое преобразование non-determenistic.

или я неправильно возражение понял? в контексте изначальной темы топика - формат
строки, использованный топикстартером, не мог быть причиной ошибки о некорректном
преобразовании строки в дату - даже если использовалось неявное или явное, но без
указания формата, преобразование.

Posted via ActualForum NNTP Server 1.4

29 окт 09, 13:05    [7855456]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
Влом регистрироваться
Guest
daw,

я может и тупой, но всегда понимаю как всегда, в т.ч. и при объявлении вычисляемого хранимого поля, например, а не только в контексте изначальной темы топика.
29 окт 09, 13:10    [7855495]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Влом регистрироваться
iap,

а вывод?


Пример:

SELECT YEAR('20090101')

Результат:

-----------
2009

Еще пример:

CREATE TABLE #test
(
	ID INT NOT NULL PRIMARY KEY,
	[Value] AS (YEAR('20090101')) PERSISTED NOT NULL
)

Результат:

Msg 4936, Level 16, State 1, Line 1
Computed column 'Value' in table '#test' cannot be persisted because the column is non-deterministic.
Где у Вас преобразование по 112-му формату?
CREATE TABLE #test
(
	ID INT NOT NULL PRIMARY KEY,
	[Value] AS (YEAR(CONVERT(DATETIME,'20090101',112))) PERSISTED NOT NULL
)
Результат:
Command(s) completed successfully.
29 окт 09, 13:14    [7855544]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
Влом регистрироваться
Guest
iap,

так в том-то и дело, что просто датой в формате 'yyyymmdd' не обойтись, надо делать CONVERT, да еще с таким стилем, чтобы преобразование было determenistic. О чем я и говорю на протяжении всего топика...
29 окт 09, 13:19    [7855590]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
daw
Member

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

> я может и тупой, но *всегда* понимаю как всегда, в т.ч. и при объявлении
> вычисляемого хранимого поля, например, а не только *в контексте
> изначальной темы топика*.

давайте уже отдельные слова-то не вырывать. "всегда преобразуется правильно".
когда оно неправильно преобразуется? примера неправильного преобразования, я не увидел.

Posted via ActualForum NNTP Server 1.4

29 окт 09, 13:20    [7855610]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
Влом регистрироваться
Guest
daw,

вы утверждали, что оно всегда преобразуется правильно, а я привел пример, когда оно вообще не преобразуется.

И если уж на то пошло, то для доказательства утверждения (когда преобразование проходит) недостаточно привести N удачных примеров, надо бы цитату из БОЛа , а для опровержения - достаточно одного контрпримера, что я и привел.
29 окт 09, 13:25    [7855668]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
daw
Member

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

относительно детерминистичности неявного преобразования
вообще кроме вас никто речь не вел.
я больше могу сказать - даже само утверждение об однозначной
интерпретации сервером строки типа yyyymmdd подтверждается только
"де-факто" - в документации это, если не ошибаюсь, не отражено.
и тем не менее - имелось вполне конкретное ваше высказывание о том,
что строка в формате yyyymmdd не всегда правильно преобразуется
сервером к дате. если это возражение снимается - у меня все.

Posted via ActualForum NNTP Server 1.4

29 окт 09, 13:27    [7855685]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
daw
Member

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

> вы утверждали, что оно всегда преобразуется правильно, а я привел
> пример, когда оно вообще не преобразуется.

да какое нафиг "не преобразуется"? сервер и не пытается что-то там
преобразовывать - есть преобразование без указания стиля - все, до свиданья,
выражение недетерминировано.

Posted via ActualForum NNTP Server 1.4

29 окт 09, 13:29    [7855714]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
daw
Member

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

а сервер и вот такое, например, выражение

datename(year, convert(datetime, '20090101', 112))

недетерминированным считает.
давайте теперь утверждать что оно разные значения в зависимости от чего-то может выдавать?

Posted via ActualForum NNTP Server 1.4

29 окт 09, 13:36    [7855811]     Ответить | Цитировать Сообщить модератору
 Re: yyyymmdd  [new]
Влом регистрироваться
Guest
daw,

детерминистичность - это важно! ибо вот такой код таблицу создает успешно!

CREATE TABLE #test
(
	ID INT NOT NULL PRIMARY KEY,
	[Value] AS (YEAR('20090101')) -- PERSISTED NOT NULL
)
29 окт 09, 13:39    [7855845]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить