Объедините столбец DATETIME с полем CHAR, чтобы создать столбец DATETIME2 - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь импортировать данные из базы данных поставщика и объединить два столбца в один для нашей базы данных.У них есть два столбца: CITATION_DATE, который является datetime типом данных, и CITATION_TIME, который является char(8) типом данных.

Я хотел бы объединить эти два столбца в один столбец issueDate, которыйимеет тип данных datetime2(7).

enter image description here

Я попытался использовать логику Аарона, найденную здесь , но мне не удалось получитьзапрос для выполнения.Я подозреваю, что мне нужно больше символов в CITATION_TIME для формирования правильной отметки времени, но я не уверен.

Есть ли способ объединить эти два поля в один столбец - после datetime2 format?

Я пытался очистить недопустимые значения, такие как пустые строки или нечисловые символы:

;WITH issueDate AS
( 
    SELECT 
        TRY_CAST(vt.CITATION_DATE AS DATE) AS CITATION_DATE ,
        CASE WHEN RTRIM ( LTRIM ( vt.CITATION_TIME )) = '' THEN '0000'
             WHEN RTRIM ( LTRIM ( vt.CITATION_TIME )) = '000' THEN '0000'
             WHEN TRY_CAST(vt.CITATION_TIME AS INT) IS NULL THEN '0000'
             ELSE vt.CITATION_TIME
        END AS CITATION_TIME
    FROM   
        Oklahoma_PVD_WildlifeLaw.dbo.VIOLATOR_TICKETS AS vt
    --ORDER BY CITATION_TIME;
)
SELECT 
    CONVERT(DATETIME, CONVERT(CHAR(8), id.CITATION_DATE, 112) + ' ' + 
       CONVERT(CHAR(8), id.CITATION_TIME, 108))
FROM   
    issueDate AS id;

Но я получаю следующую ошибку:

Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона

Похоже, мне не хватает символов для части TIME - какэто возвращает значения в формате DATETIME, но я теряю все свои часы и минуты таким образом:

;WITH issueDate AS 
(
    SELECT 
        TRY_CAST(vt.CITATION_DATE AS DATE) AS CITATION_DATE,
        CASE 
           WHEN RTRIM(LTRIM(vt.CITATION_TIME)) = '' THEN '00:00:00.0000000'
           WHEN RTRIM(LTRIM(vt.CITATION_TIME)) = '000' THEN '00:00:00.0000000'
           WHEN TRY_CAST(vt.CITATION_TIME AS INT) IS NULL THEN '00:00:00.0000000'
           --ELSE vt.CITATION_TIME
        END AS CITATION_TIME
    FROM   
        Oklahoma_PVD_WildlifeLaw.dbo.VIOLATOR_TICKETS AS vt
    --ORDER BY CITATION_TIME;
)
SELECT 
    CONVERT(DATETIME, CONVERT(CHAR(8), id.CITATION_DATE, 112) + ' ' +
        CONVERT(CHAR(8), id.CITATION_TIME, 108)) AS [DateTime]
FROM   
    issueDate AS id
WHERE
    CONVERT(DATETIME, CONVERT(CHAR(8), id.CITATION_DATE, 112) + ' ' +
        CONVERT(CHAR(8), id.CITATION_TIME, 108)) IS NOT NULL;

1 Ответ

0 голосов
/ 11 декабря 2018

Вы пытались вычислить количество минут из временной части и добавить их к дате, используя DATEADD ?

select DATEADD(minute, cast(CITATION_TIME as int) % 100 + 60 * (cast(CITATION_TIME as int) / 100), CITATION_DATE)
FROM   Oklahoma_PVD_WildlifeLaw.dbo.VIOLATOR_TICKETS AS vt

В этом коде предполагается, что все даты имеют нулевую часть времени (полночь) и CITATION_TIME - все цифры.Приведенный выше код пытается обработать их, приведя дату к дате (чтобы избавиться от части времени) и используя try_cast для обработки нечисловых времен.Если вам нужно, вы можете использовать тот же код:

select DATEADD(minute, t.IntTime % 100 + 60 * (t.IntTime / 100), cast(CITATION_DATE as date))
FROM   Oklahoma_PVD_WildlifeLaw.dbo.VIOLATOR_TICKETS AS vt
cross apply (select isnull(try_cast(CITATION_TIME as int), 0) as IntTime ) t

Если в ваших данных есть недопустимые «времена», вы должны решить, как их обработать.Попробуйте найти эти записи, выполнив поиск значений, где последние 2 цифры> = 60, например:

select * from Oklahoma_PVD_WildlifeLaw.dbo.VIOLATOR_TICKETS
where try_cast(right(CITATION_TIME, 2) as int) >= 60
   or (len(CITATION_TIME) = 4 and try_cast(left(CITATION_TIME, 2) as int) >= 24)       
   or len(CITATION_TIME) > 4
...