У меня есть таблица с двумя столбцами: 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
5
Пожалуйста, отметьте свой вопрос той базой данных, которую вы используете.
 – 
Gordon Linoff
3 Июл 2014 в 17:50
Что это за временная метка? где вы его генерируете? Ах, теперь, когда я смотрю на это, это не метка времени! ;) Это выглядит как обычное значение даты и времени 2014-07-03 14:45:04, где вы только что удалили - и :
 – 
DrCopyPaste
3 Июл 2014 в 18:03
2
Почему вы изначально не храните эти данные в столбце соответствующего типа?
 – 
Damien_The_Unbeliever
3 Июл 2014 в 18:06
Вы правы, неправильное использование слов! :) Я не знаю, как это было сгенерировано. Правильно, это значение даты и времени, но мне нужно, чтобы оно имело формальные определения времени для использования datediff, если я не ошибаюсь. Как я уже сказал, для дневной даты это работает нормально, и для datediff тоже. Когда я использовал его для даты дня, я удалил его из чч-мм-сс, используя левую команду.
 – 
Manuel Silva
3 Июл 2014 в 18:12
Поскольку формат, в котором вы сохранили эти «временные метки», вероятно, не изменится в ближайшие 7000 лет, вы можете использовать STUFF(STUFF(STUFF(STUFF(STUFF('20140703144504', 5, 0, '-'), 8, 0, '-'), 11, 0, ' '), 14, 0, ':'), 17, 0, ':') для преобразования его в стандартизированный формат даты (например, 2014-07-03 14:45:04), который затем можно легко преобразовать или работал через DATEPART, например, для определения часовой части.
 – 
DrCopyPaste
3 Июл 2014 в 18:24

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 в 18:37
1
Если вы собираетесь преобразовать строку в формат, который можно преобразовать в datetime, по крайней мере, либо преобразуйте ее в недвусмысленный формат, или< /i> по крайней мере укажите параметр style в вызове CONVERT. В настоящее время это не делает ни того, ни другого и может привести к созданию даты и времени либо 7 марта, либо 3 июля.
 – 
Damien_The_Unbeliever
3 Июл 2014 в 18:31

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

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

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

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

0
Bryan 3 Июл 2014 в 18:27