У меня есть таблица с двумя столбцами: Customer_ID, которая является строкой, идентифицирующей каждого клиента, и Time_id: строка из 14 символов, идентифицирующая временную метку транзакции. Пример:

Customer_id; Time_id
12345; 20140703144504

Я хочу иметь возможность использовать dateiff в часах datepart, но мне кажется, что я не могу правильно преобразовать time_id. Я использую следующий запрос:

update transation_table
set time_id= (
convert(timestamp, time_id)
)

Он работает, но удаляет часы datepart, что мне нужно. Для дня datepart я могу это сделать, преобразовав в datetime. Как мне сохранить в таблице чч?

Изменить: я запускаю MS SQL Server 2014.

С наилучшими пожеланиями

0
Manuel Silva 3 Июл 2014 в 17:49

2 ответа

Лучший ответ

Используя приведенное ниже преобразование и конкатенацию строк, вы можете использовать DATEPART для полученного значения.

DECLARE @tmp TABLE(
    Customer_id VARCHAR(50),
    Time_id VARCHAR(50)
)

INSERT INTO @tmp
    SELECT '12345','20140703144504'

select
    *,CONVERT(DATETIME,
        SUBSTRING(Time_id,5,2) + '/' +
        SUBSTRING(Time_id,7,2) + '/' +
        SUBSTRING(Time_id,1,4) + ' ' +
        SUBSTRING(Time_id,9,2) + ':' +
        SUBSTRING(Time_id,11,2) + ':' +
        SUBSTRING(Time_id,13,2)
        ,101
    )
from @tmp
1
UnhandledExcepSean 3 Июл 2014 в 14:37

Используйте FORMAT, чтобы получить строковое представление значения в поддерживаемый формат (канонический ODBC в таблице стилей даты и времени), затем используйте TRY_CONVERT, чтобы вернуть фактическое значение даты и времени:

SELECT TRY_CONVERT(DATETIME,
                   FORMAT(CAST('20140703144504' AS BIGINT),
                          '####-##-## ##:##:##'),
                   120);

Для этого требуется SQL Server 2012+.

Как упоминалось в другом месте, данные должны храниться в одном столбце datetime2, или парные date и время. Вышеупомянутые функции могут использоваться для преобразования существующих данных в новые столбцы.

0
Bryan 3 Июл 2014 в 14:27