Почему 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 (используется формат сервера по умолчанию для этого преобразования [Это считается датой по умолчанию плюс количество дней, равное вычисленному). сумма присвоенного значения.])