Какой стиль даты по умолчанию используется экземпляром SQL Server при преобразовании из varchar в datetime? - PullRequest
0 голосов
/ 29 мая 2020

Я выполнил этот SQL запрос на двух разных серверах:

declare @test as datetime='2020-05-06 00:00:00'
select Convert (nvarchar,@test) 

Результаты были разными на двух серверах:

  1. 6 мая 2020 г. 00:00
  2. 5 июня 2020 г. 12:00 AM

Я знаю причину этого, когда SQL Сервер читает строку, которую я передал 2020-05-06 00:00:00, и преобразует ее в DateTime в операторе declare используется стиль даты по умолчанию.

Могу ли я настроить этот стиль по умолчанию, или, другими словами, как стиль даты по умолчанию выбирается на SQL сервере при преобразовании varchar в datetime? Это из региональных настроек windows или некоторых других конфигураций внутри SQL Сервера?

1 Ответ

2 голосов
/ 29 мая 2020

Он использует стиль, основанный на языке. В принципе, для даты, указанной выше, если вы американец, тогда дата будет читаться как yyyy-MM-dd hh:mm:ss, однако, если использовать на разных языках, тогда это будет (глупо) читаться как yyyy-dd-MM hh:mm:ss.

Если вы используете строки для дат (например, ваш литерал здесь), а затем стремитесь использовать однозначный формат. В SQL сервере, независимо от типа данных и языка, это yyyy-MM-ddThh:mm:ss.nnnnnnn и yyyyMMdd.

Если вы конвертируете в (n)varchar, всегда используйте код стиля (и длину для varchar) для согласованных результатов.

Итак, для своего значения вы можете запустить следующую команду, чтобы узнать, какое значение преобразования будет по умолчанию для всех языков в вашем экземпляре:

DECLARE Languages CURSOR FOR
SELECT alias
FROM sys.syslanguages;

DECLARE @Alias sysname,
        @SQL nvarchar(MAX);

CREATE TABLE #ConvertedDates (Alias sysname, dt datetime, converted nvarchar(25));

DECLARE @dt datetime = '2020-05-06T00:00:00'

OPEN Languages

FETCH NEXT FROM Languages
INTO @Alias;

WHILE @@FETCH_STATUS = 0
BEGIN

    SET @SQL = N'SET LANGUAGE ' + QUOTENAME(@Alias) + N'; INSERT INTO #ConvertedDates(Alias,dt,converted) VALUES(N' + QUOTENAME(@Alias,'''') + ',@dt,CONVERT(nvarchar(25),@dt));';

    EXEC sys.sp_executesql @SQL, N'@dt datetime', @dt;

    FETCH NEXT FROM Languages
    INTO @Alias;

END;

CLOSE Languages;
DEALLOCATE Languages;

SELECT *
FROM #ConvertedDates;

DROP TABLE #ConvertedDates;

Да, это курсор. Я хотел убедиться, что каждый оператор Dynami c запускается сам по себе, чтобы гарантировать сохранение языка для каждого преобразования.

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