#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, которая будет включать переход контекста / процесса.