Как преобразовать приведенную ниже текстовую строку в тип даты с помощью SQL Server 2016 - PullRequest
0 голосов
/ 11 ноября 2018
ActivateDate        ShipDate                Month   Month_Length    Day-2c  Day-2c_Length   YEAR-201x   SHIPDateConcatenate     ActivateDateConcatenate
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
NULL                6/12/2018 12:00:00 AM   6       1               12      2               2018        6-12-2018               NULL
10/12/2018 14:45    10/16/2018 12:00:00 AM  10      2               16      2               2018        10-16-2018              10-12-2018

Два столбца [ActivateDate] и [ShipDate] тип данных перечислены ниже; однако каждый раз, когда я пытаюсь использовать convert () или cast () для типа даты, происходит ошибка преобразования.

SELECT
    [ActivateDate], -- '10/12/2018 14:45' nvarchar(100)
    [ShipDate], -- '6/12/2018 12:00:00 AM'   nvarchar(100)
    SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/', iedimpr.[ShipDate])-2,2) as 'Month',
    LEN(SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/', iedimpr.[ShipDate])-2,2)) as 'Month_Length',
    REPLACE(SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/', iedimpr.[ShipDate])+1,2),'/','') as 'Day-2c',
    LEN(REPLACE(SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/', iedimpr.[ShipDate])+1,2),'/','')) as 'Day-2c_Length',
    SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/201', iedimpr.[ShipDate])+1,4) as 'YEAR-201x',
    SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/', iedimpr.[ShipDate])-2,2)
+'-'+REPLACE(SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/', iedimpr.[ShipDate])+1,2),'/','') 
+'-'+SUBSTRING(iedimpr.[ShipDate],CHARINDEX('/201', iedimpr.[ShipDate])+1,4) as 'SHIPDateConcatenate',
    SUBSTRING(iedimpr.[ActivateDate],CHARINDEX('/', iedimpr.[ActivateDate])-2,2)
+'-'+REPLACE(SUBSTRING(iedimpr.[ActivateDate],CHARINDEX('/', iedimpr.[ActivateDate])+1,2),'/','') 
+'-'+SUBSTRING(iedimpr.[ActivateDate],CHARINDEX('/201', iedimpr.[ActivateDate])+1,4) as 'ActivateDateConcatenate'

1 Ответ

0 голосов
/ 12 ноября 2018

После прочтения вопроса я заметил, что примеры данных плохо отформатированы, поэтому я отредактировал их. Во время этого редактирования я обнаружил, что вы используете американский стиль (mm/dd/yyyy) для строкового представления дат.

Чтобы преобразовать допустимое строковое представление DateTime с этим форматом в дату, вам нужно использовать 101 в качестве параметра style в методе convert.
Однако я настоятельно рекомендую использовать Try_convert вместо Convert, поскольку он просто вернет null, когда значение не может быть преобразовано, вместо выдачи ошибки.

Как говорится, вот пример:

Сначала создайте и заполните примеры данных ( Пожалуйста, сохраните этот шаг в ваших будущих вопросах):

DECLARE @T AS TABLE
(
    ActivateDate nvarchar(100),
    ShipDate nvarchar(100)
)

INSERT INTO @T(ActivateDate, ShipDate) VALUES
(NULL,                  '6/12/2018 12:00:00 AM'),
('10/12/2018 14:45',    '10/16/2018 12:00:00 AM'),
('20/14/2018 14:45',    '10/16/2018 12:00:00 AM'), -- invalid ActivateDate
('2/4/2018 14:45',      '10/16/ZOIB 12:00:00 AM') -- invalid ShipDate

Запрос:

SELECT  ActivateDate, 
        ShipDate,
        TRY_CONVERT(datetime, ActivateDate, 101) As DateActiveDate,
        TRY_CONVERT(datetime, ShipDate, 101) As DateShipDate
FROM @T

Результаты:

ActivateDate        ShipDate                    DateActiveDate          DateShipDate
NULL                6/12/2018 12:00:00 AM       NULL                    12.06.2018 00:00:00
10/12/2018 14:45    10/16/2018 12:00:00 AM      12.10.2018 14:45:00     16.10.2018 00:00:00
20/14/2018 14:45    10/16/2018 12:00:00 AM      NULL                    16.10.2018 00:00:00
2/4/2018 14:45      10/16/ZOIB 12:00:00 AM      04.02.2018 14:45:00     NULL

Если вам нужно только Date (без временной части), просто используйте try_convert(date, ...) вместо try_convert(datetime, ...).

...