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];