Укажите формат datetime2 в хранилище данных SQL Azure (synapse)

#azure #data-warehouse #azure-sqldw #azure-synapse

#azure #хранилище данных #azure-sqldw #azure-synapse

Вопрос:

Как правильно указать формат поля datetime2 при создании таблицы в хранилище данных SQL Azure? Кажется, я не могу найти пример в документации.

Данные выглядят следующим образом:

«2020-09-14T20:50:48.000Z»

 CREATE TABLE [Foo].[Bar](
    ...
    MyDateTime datetime2(['YYYY-MM-DDThh:mm:ss[.fractional seconds]')
)
  

Комментарии:

1. Даты не имеют форматов, они являются двоичными значениями, такими же, как int , decimal или varbinary . Никаких «если» или «но». Форматы применяются только тогда, когда строка генерируется на основе этого двоичного значения или строка анализируется в это двоичное значение. Форматирование — это работа клиента , будь то веб-приложение или механизм создания отчетов. В конце концов, только клиент знает языковые и региональные настройки конечного пользователя

2. Кстати, это относится ко всем продуктам базы данных, а не только к SQL Server. Это то, что позволяет базам данных обслуживать клиентов на любой локали, в любом формате. Если вы сохранили строку даты в локализованном формате, вы не сможете прочитать ее, не используя точно такой же формат (не говоря уже о том, чтобы занимать дополнительное место). Хуже того, не было бы способа проверить неправильный синтаксический анализ — что такое 4/7 ? 4 июля или 7 апреля?

Ответ №1:

Как отмечает Панайотис, базовым представлением является значение int / long для фактического значения даты. Именно так движки СУБД могут быстро вычислить разницу между двумя датами (дни между понедельником и пятницей — это простая задача вычитания). Чтобы ответить на ваш вопрос, вам просто нужно отформатировать таблицу create как:

 CREATE TABLE [Foo].[Bar](
    ...
    MyDateTime datetime2
)
  

Если вы заинтересованы в форматировании результата в запросе, вы можете обратиться к функциям CONVERT или FORMAT. Например, если вам нужен формат дд-мм-гггг (итальянская дата), вы могли бы использовать любой из следующих:

 SELECT
    CONVERT(VARCHAR, CURRENT_TIMESTAMP, 105)
    , FORMAT(CURRENT_TIMESTAMP, 'dd-MM-yyyy')
  

Примечание: ПРЕОБРАЗОВАНИЕ обычно выполняется быстрее, чем ФОРМАТ, и это рекомендуемый подход, если у вас поддерживается формат даты. Это связано с тем, что функция FORMAT зависит от среды CLR, которая будет включать переход контекста / процесса.