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

Откуда: (((@)))
Сообщений: 8863
Это у всех так или мне особенно "повезло" с версией?


-------------------------------------------------------------------------------------------------
Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
Sep 24 2019 13:48:23
Copyright (C) 2019 Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)



convert(nvarchar(50),getdate(),127) convert(nvarchar(50),getdate(),126)
-------------------------------------------------- --------------------------------------------------
2021-06-05T19:33:53.140 2021-06-05T19:33:53.140

convert(nvarchar(50),cast(getdate() as datetimeoffset) ,127) convert(nvarchar(50),cast(getdate() as datetimeoffset) ,126)
------------------------------------------------------------ -------------------------------------------------------------
2021-06-05T19:33:53.1400000Z 2021-06-05T19:33:53.1400000+00:00


Почему форматы 126 и 127 меняют выдачу в зависимости от исходного представления данных (datetime vs datetimeoffcet) ?

--------------------------
No ROM Basic...

P.S. Тута подробностей не увидел

+
set nocount on;
select @@version;
select convert(nvarchar(50),getdate(),127) [convert(nvarchar(50),getdate(),127)], convert(nvarchar(50),getdate(),126) [convert(nvarchar(50),getdate(),126)]
select convert(nvarchar(50),cast(getdate() as datetimeoffset) ,127)  [convert(nvarchar(50),cast(getdate() as datetimeoffset) ,127)], convert(nvarchar(50),cast(getdate() as datetimeoffset) ,126) [convert(nvarchar(50),cast(getdate() as datetimeoffset) ,126) ]



Сообщение было отредактировано: 5 июн 21, 19:35
5 июн 21, 19:43    [22331801]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование даты через CONVERT(), форматы 126 и 127 .  [new]
godsql
Member

Откуда:
Сообщений: 206
Думаю, вам нужно перечитать документацию по типам данных (datetime vs datetimeoffcet) и чем они отличаются.

При преобразовании из типа datetimeoffset(n) копируются компоненты даты и времени. Часовой пояс усекается. Если точность в долях секунды для значения datetimeoffset(n) превышает три разряда, значение будет усечено. Следующий пример показывает результаты преобразования значения datetimeoffset(4) в значение datetime.
5 июн 21, 20:24    [22331809]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование даты через CONVERT(), форматы 126 и 127 .  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8863
godsql
Думаю, вам нужно перечитать документацию по типам данных (datetime vs datetimeoffcet) и чем они отличаются.

При преобразовании из типа datetimeoffset(n) копируются компоненты даты и времени. Часовой пояс усекается. Если точность в долях секунды для значения datetimeoffset(n) превышает три разряда, значение будет усечено. Следующий пример показывает результаты преобразования значения datetimeoffset(4) в значение datetime.


Эээээммм....
Вопрос был не про datetimeOFFSET => datetime а про то, почему convert с форматами 126 и 127 выдаёт несколько разные строки при разных типах исходных данных ... Может это где-то в настройках управляется. Есличо, в документации есть ссылка на стандарт ISO , под который можно пропихнуть что угодно, но с примерами беда (например, знаков после точки не 3 а 6, Z то есть - то нет, ...):

К сообщению приложен файл. Размер - 78Kb


Сообщение было отредактировано: 5 июн 21, 20:58
5 июн 21, 21:05    [22331815]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование даты через CONVERT(), форматы 126 и 127 .  [new]
godsql
Member

Откуда:
Сообщений: 206
автор
почему convert с форматами 126 и 127 выдаёт несколько разные строки при разных типах исходных данных

Потому, что это разные типы данных. :)
в одном случае - datetime (Часовой пояс усекается. Если точность в долях секунды превышает три разряда, значение будет усечено)
в другом - datetimeoffset, где все это присутствует
А стиль уже применяется к конкретному значению конкретного формата

Вы же не удивляетесь, почему convert(varchar(10), 15.2222 as int) выдаст совсем не то ,что convert(varchar(10), 15.2222 as decimal(31,2)) нежели исходные данные (15.2222)
5 июн 21, 21:44    [22331827]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование даты через CONVERT(), форматы 126 и 127 .  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8863
Ну, я со своей задачей справился. Но на выходе я жду строку в определённом формате, который описан. Надо будет всю эту хреноту попробовать в C# ,- не удивлюсь если будет похожее,- возможно где-то в глубине винды сиё поведение реализовано...


Так, чиста поржать (логично, но не всегда) :
+
set nocount on;
select convert(int, 17.777) [convert(int, 17.777)      ],convert(decimal, 17.777) [convert(decimal, 17.777)]
select convert(int, 17) [convert(int, 17)          ],convert(decimal, 17) [convert(decimal, 17) ]
select convert(int, 0.17777E2) [convert(int, 0.17777E2)   ], convert(decimal, 0.17777E2) [convert(decimal, 0.17777E2)]


convert(int, 17.777)       convert(decimal, 17.777)
-------------------------- ---------------------------------------
17 18

convert(int, 17) convert(decimal, 17)
-------------------------- ---------------------------------------
17 17

convert(int, 0.17777E2) convert(decimal, 0.17777E2)
-------------------------- ---------------------------------------
17 18




Сообщение было отредактировано: 5 июн 21, 22:09
5 июн 21, 22:17    [22331833]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование даты через CONVERT(), форматы 126 и 127 .  [new]
4es
Member

Откуда:
Сообщений: 26
SIMPLicity_
логично, но не всегда

Да всё логично. Всё это поведение отлично описано в документации и известно.
6 июн 21, 12:26    [22331878]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить