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

Откуда:
Сообщений: 758
Я передаю параметр типа DateTime из клиентского приложения на C#. Профайлер показывает

exec MyProc @Id='59263FED-A333-4D9A-A8BB-3BE0D8E665EB', @CurrentDate='2011-06-22 14:01:00.747'

Ошибка
автор
Msg 8114, Level 16, State 5, Procedure MyProc, Line 0
Ошибка при преобразовании типа данных varchar к datetime.





Причем, на других процедурах такая ошибка не всегда встречается когда есть параметр datetime.

Почему это происходит? Как сделать так, чтобы не приходилось править sql код, приводя каждый раз к правильному виду datetime, а сделать это в клиентском коде при вызове sql процедуры?

В базе данные хранятся в виде
2011-06-22 13:21:41.723
То есть в том же самом, в каком передаются в параметре.
22 июн 11, 14:21    [10854374]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Compilator
Member

Откуда:
Сообщений: 19
Какой тип @CurrentDate параметра в процедуре ?
22 июн 11, 14:26    [10854437]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Darooma
Member

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

DATETIME
22 июн 11, 14:27    [10854452]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Darooma
Member

Откуда:
Сообщений: 758
 SELECT UserId FROM UserPasswordReminders
     WHERE Id='59263FED-A333-4D9A-A8BB-3BE0D8E665EB'
     AND ExpireOn<'2011-06-22 14:01:00.747'
     AND IsUsed=0

автор
Msg 242, Level 16, State 3, Line 1
Преобразование типа данных varchar в тип данных datetime привело к выходу значения за пределы диапазона.
22 июн 11, 14:30    [10854495]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Darooma,

YYYYMMDD используйте или следите за правильным языком у пользователя.

offtop

эту проблему пора в икону оформлять и на доску почета вешать:))
22 июн 11, 14:32    [10854515]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
WarAnt
Darooma,

YYYYMMDD используйте или следите за правильным языком у пользователя.

offtop

эту проблему пора в икону оформлять и на доску почета вешать:))
Да уже оформлено все давно и висит, где надо.
https://www.sql.ru/faq/faq_topic.aspx?fid=109
22 июн 11, 14:33    [10854524]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Darooma
Member

Откуда:
Сообщений: 758
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=850517&msg=10647205
22 июн 11, 14:34    [10854530]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Darooma
Member

Откуда:
Сообщений: 758
и еще
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=850517&msg=10649468
22 июн 11, 14:35    [10854541]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Compilator
Member

Откуда:
Сообщений: 19
2011-06-22 - распознало как 2011 год 06 число 22 месяц. используйте convert с выбором формата форматы
22 июн 11, 14:36    [10854543]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Darooma
Member

Откуда:
Сообщений: 758
автор
Как сделать так, чтобы не приходилось править sql код, приводя каждый раз к правильному виду datetime, а сделать это в клиентском коде при вызове sql процедуры?
22 июн 11, 14:37    [10854558]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Darooma
автор
Как сделать так, чтобы не приходилось править sql код, приводя каждый раз к правильному виду datetime, а сделать это в клиентском коде при вызове sql процедуры?
Как использовать параметры, надо спрашивать в форуме по вашему средству разработки. Или все сделали не так, или вы что-то сделали не так, и в итоге это приводит к тому, что ваше приложение посылает неверную команду на сервер. В общем, сервер здесь ни при чем.
22 июн 11, 14:39    [10854584]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Compilator
Member

Откуда:
Сообщений: 19
Формат зависит от того какая локализация выбрана. Но чтобы косяков не было - лучше не надеяться на то что клиент все правильно сформирует а перепроверять на сервере и приводить к нужному виду.
22 июн 11, 14:42    [10854612]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Darooma
В базе данные хранятся в виде

2011-06-22 13:21:41.723
И еще. Если у вас поле datetime, то там нет никакого "в виде". Поле datetime хранит только значние, всегда однозначно соответствующее какой-то дате, там нет никакой информации ни о каком формате. Просто ваше клиентское приложение, которым вы "смотрите" в таблицу, рисует его в понятном для человека виде, выбрав по каким-то своим правилам формат _отображения_ этой даты.
22 июн 11, 14:45    [10854635]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Darooma
и еще
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=850517&msg=10649468
Ну так а если вы все знаете, то в чем тогда вопрос?

Руководствуйтесь следующими принципами:
- параметры с клиента в запросы всегда надо передавать через специальную коллекцию параметров, которую предоставляет клиентский api.
- параметры в клиентском апи должны иметь правильный тип, то есть в вашем случае DateTime
- если вы копипастите запрос отловленный профайлером и выполняете его в SSMS сделайте настройки соединения, такие же какие использует клиент
- внутри процедуры, если вы делаете преобразования/манипуляции с параметром, следите за тем чтобы все переменные имели тип datetime, чтобы не было никаких неявных или явных преобразований в строку и обратно.
- если преобразования все же требуются (или требуется задать дату строкой), то следите за тем чтобы строка задающая дату имела языконезависимый формат, например YYYYMMDD.
- все поля с которыми так или иначе идет сравнение с параметром datetime, тоже должны иметь тип datetime.

если все это соблюдать, проблем и неожиданностей подобных вашей (и еще сотням таких же которые постят тут через день) быть не должно.
22 июн 11, 14:45    [10854638]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Гавриленко Сергей Алексеевич
WarAnt
Darooma,

YYYYMMDD используйте или следите за правильным языком у пользователя.

offtop

эту проблему пора в икону оформлять и на доску почета вешать:))
Да уже оформлено все давно и висит, где надо.
https://www.sql.ru/faq/faq_topic.aspx?fid=109


значит размера иконы не достаточно, может топик закрытый сделать, типа "Если в вас проблемы с datetime сначала загляните сюда"?
22 июн 11, 14:46    [10854651]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
WarAnt
значит размера иконы не достаточно, может топик закрытый сделать, типа "Если в вас проблемы с datetime сначала
загляните сюда"?
Вы не поверите...
ТОП 10 самых популярных вопросов ( https://www.sql.ru/forum/actualthread.aspx?tid=128516 )
8. Вопрос: Как задать формат даты на SQL Server ?
Ответ: Формат преобразования символьной строки в дату задается так.
Формат отображения даты задается самим клиентским приложением
22 июн 11, 14:48    [10854671]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Darooma
 SELECT UserId FROM UserPasswordReminders
     WHERE Id='59263FED-A333-4D9A-A8BB-3BE0D8E665EB'
     AND ExpireOn<'2011-06-22 14:01:00.747'
     AND IsUsed=0

автор
Msg 242, Level 16, State 3, Line 1
Преобразование типа данных varchar в тип данных datetime привело к выходу значения за пределы диапазона.
В данном случае, если забыть о клиенте, gthtlfxt даты через параметры и т.п.,
формат даты легко превращается в стандартный, если пробел заменить на заглавную английскую букву "T"
SELECT UserId FROM UserPasswordReminders
WHERE Id='59263FED-A333-4D9A-A8BB-3BE0D8E665EB'
  AND ExpireOn<'2011-06-22T14:01:00.747'
  AND IsUsed=0
22 июн 11, 14:50    [10854687]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Darooma
Member

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

спасибо, то что надо.

'2011-06-12T14:01:00.747' всегда будет интерпретирован сервером как 12 июня 2011 а не 6 декабря 2011. То есть независимо от настроек сервера ?
22 июн 11, 14:57    [10854768]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Гавриленко Сергей Алексеевич
WarAnt
значит размера иконы не достаточно, может топик закрытый сделать, типа "Если в вас проблемы с datetime сначала
загляните сюда"?
Вы не поверите...
ТОП 10 самых популярных вопросов ( https://www.sql.ru/forum/actualthread.aspx?tid=128516 )
8. Вопрос: Как задать формат даты на SQL Server ?
Ответ: Формат преобразования символьной строки в дату задается так.
Формат отображения даты задается самим клиентским приложением


да я то верю, а вот люди нет, в итоге рождаются топики с одинаковым содержанием:)
в общем я предложение сделал решать как всегда Вам:)
22 июн 11, 14:59    [10854791]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
WarAnt
да я то верю, а вот люди нет, в итоге рождаются топики с одинаковым содержанием:)
в общем я предложение сделал решать как всегда Вам:)
Да можно хоть 10 топиков написать семиметровыми буквами... Если человек не хочет читать или понимать что-то, он не прочитает и не пойемет.
22 июн 11, 15:02    [10854826]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Darooma
iap,

спасибо, то что надо.

'2011-06-12T14:01:00.747' всегда будет интерпретирован сервером как 12 июня 2011 а не 6 декабря 2011. То есть независимо от настроек сервера ?
Ну конечно.

Но! Что Вам мешает сделать по-человечески: при создании параметра на клиенте задать тип DATETIME???
Тогда, присвоив этому параметру значение типа DATETIME,
Вы будете уверены, что драйвер сам передаст серверу дату в том виде, в котором надо!
Причём, это будет правильно всегда, даже когда Вы променяете MSSQL на какой-нибудь другой сервер.
Просто потому, что там будет на Вас работать другой драйвер, родной для другого сервера.
А параметры-то на клиенте внешне будут вести себя точно так же.
22 июн 11, 15:04    [10854849]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
invm
Member

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

Жизнь показывает, что сколько ни делай FAQ'ов, сколько ни прилепляй ссылки на эти FAQ'и, большинство все равно туда не пойдет, пока не пнешь. Да и пинания нередко игнорируются.
22 июн 11, 15:08    [10854899]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Darooma
Member

Откуда:
Сообщений: 758
iap
Darooma
iap,

спасибо, то что надо.

'2011-06-12T14:01:00.747' всегда будет интерпретирован сервером как 12 июня 2011 а не 6 декабря 2011. То есть независимо от настроек сервера ?
Ну конечно.

Но! Что Вам мешает сделать по-человечески: при создании параметра на клиенте задать тип DATETIME???
Тогда, присвоив этому параметру значение типа DATETIME,
Вы будете уверены, что драйвер сам передаст серверу дату в том виде, в котором надо!

Это не так. Поэтому я и создал эту тему. Я передаю тип DateTime с клиента на C#. На сервере аналог DateTime клиента- это DATETIME.
22 июн 11, 15:22    [10855093]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Darooma
iap
пропущено...
Ну конечно.

Но! Что Вам мешает сделать по-человечески: при создании параметра на клиенте задать тип DATETIME???
Тогда, присвоив этому параметру значение типа DATETIME,
Вы будете уверены, что драйвер сам передаст серверу дату в том виде, в котором надо!

Это не так. Поэтому я и создал эту тему. Я передаю тип DateTime с клиента на C#. На сервере аналог DateTime клиента- это DATETIME.
Я видел, как Вы создаёте параметры без явного указания типа данных.
Они у Вас получаются строковыми, а не типа даты.
Поэтому на сервер передаётся строка, сформированная на основе локальных настроек клиента.
22 июн 11, 15:25    [10855120]     Ответить | Цитировать Сообщить модератору
 Re: DateTime в Sql Server 2008 r2  [new]
Darooma
Member

Откуда:
Сообщений: 758
iap,
>>Я видел, как Вы создаёте параметры без явного указания типа данных.
где именно?
22 июн 11, 15:30    [10855191]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить