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

Я не понимаю, почему 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 ответа

Решение

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'));), который является днем ​​недели, который был 02 января 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];

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

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

выход

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

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

Проверьте:

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

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

Другие вопросы по тегам