Почему DATENAME (GETDATE ()) дает другой результат, чем DATENAME (2019-02-01), когда это дата сегодня? - PullRequest
0 голосов
/ 01 февраля 2019

Я не понимаю, почему DATENAME (GETDATE ()) дает другой результат, чем DATENAME (2019-02-01) Когда это сегодняшняя дата

SELECT GETDATE(), DATENAME(w, GETDATE()),DATENAME(dw, 2019-02-01)

Возвращает:

2019-02-01 14:51:46.017 Friday  Monday<br>

Пока я ожидаю, что он вернется:

2019-02-01 14:51:46.017 Friday  Firday

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

2 причины.Во-первых, вы используете значение 2019-02-01;что является выражением «2019 минус 2 минус 1»;который оценивается в 2016.2016 как datetime - это дата '1905-07-10' (это 2 016-й день после '1900-01-01').Если вы получите значение WEEKDAY, используя функцию DATENAME из '1905-07-10', вы получите 'Monday'.

Однако, если вы измените значение на строку, потому что вы (вероятно) все ещеиспользуя datetime, значение '2019-02-01' будет интерпретироваться в формате yyyy-dd-MM, означая, что вы получите значение 'Wednesday' (SELECT DATENAME(WEEKDAY,CONVERT(datetime,'2019-02-01'));), которое является днем ​​недели, в котором было 2 января 2019 года.

Чтобы получить правильный результат, используйте не двусмысленную буквенную строку:

SELECT DATENAME(WEEKDAY,'20190201');

Не двусмысленные форматы даты (времени) (независимо от типа данных) в SQL Server: yyyyMMdd и yyyy-MM-ddThh:mm:ss.ssss (форматyyyy-MM-dd не является неоднозначным , если вы не используете datetime, обратите внимание, что если вы запускаете следующий SQL, значение для datetime будет другим:)

SELECT CONVERT(date,'2019-02-01') AS [date],
       CONVERT(datetime,'2019-02-01') AS [datetime],
       CONVERT(datetime2(0),'2019-02-01') AS [datetime2],
       CONVERT(datetimeoffset,'2019-02-01') AS [datetimeoffset];
0 голосов
/ 01 февраля 2019

DateTime следует передавать в одинарных кавычках!

Проверка:

DECLARE @date DATETIME = 2019-02-01
SELECT @date

Ваш первоначальный запрос (без кавычек) включает в себя «подразумеваемое преобразование», когда столбец даты преобразуется вvarchar (используется формат сервера по умолчанию для этого преобразования [Это считается датой по умолчанию плюс количество дней, равное вычисленной сумме присвоенного значения.])

0 голосов
/ 01 февраля 2019

Пожалуйста, используйте это datetime должно быть в строковом формате (формат даты)

 SELECT GETDATE(), DATENAME(w, GETDATE()),DATENAME(dw, '2019-02-01')

вывод

2019-02-01 14:01:38.343          Friday          Friday
...