Возможно, из-за вашей языковой настройки. Чтобы '21/04/2017'
работал, вам нужно использовать язык BRITISH
или другой язык, который использует dd/MM/yyyy
. Я подозреваю, вы используете ENGLISH
, который на самом деле является американским.
Американец использует MM/dd/yyyy
, что означает, что '21/04/2017'
будет означать 4-й день 21-го месяца в 2017 году; очевидно, это не работает.
лучший метод заключается в использовании однозначного формата, независимо от языка и типа данных. Для SQL Сервера это yyyyMMdd
и yyyy-MM-ddThh:mm:ss.nnnnnnn
(yyyy-MM-dd
и yyyy-MM-dd hh:mm:ss.nnnnnnn
не однозначны в SQL Server при использовании более старых типов данных datetime
и smalldatetime
).
В противном случае вы можете использовать CONVERT
с кодом стиля :
SELECT CONVERT(date,'21/04/2017', 103)
Однако проблема с вашими данными заключается в том, что у вас есть значения, которые находятся в формат dd/MM/yyyy
и целочисленные значения. Значение int
(не varchar
) 42817
как datetime
в SQL Server равно 2017-03-25
. С другой стороны, если эти данные пришли из Excel, тогда значение равно 2017-03-23
. Я собираюсь предположить, данные поступили из Excel, а не SQL Сервер (потому что драйверы ACE имеют привычку считывать даты в виде чисел, потому что они не являются "асом").
Поэтому вам нужно сначала преобразовать значения в однозначный формат, так что это будет yyyyMMdd
. Поскольку у нас есть 2 различных типа значений, это немного сложнее, но все же возможно:
UPDATE dbo.Leavers
SET Actual_Termination_Date = CONVERT(varchar(8), ISNULL(TRY_CONVERT(date, Actual_Termination_Date, 103), DATEADD(DAY, TRY_CONVERT(int, Actual_Termination_Date),'18991230')), 112);
Затем вы можете изменить свою таблицу:
ALTER TABLE dbo.Leavers ALTER COLUMN [Actual_Termination_Date] date;
DB <> Скрипка с использованием выражения DML Михаила Турчина.