Объединить дату и строку для создания даты и времени в SQL

Мне нужно объединить поле даты и времени в SQL с одним временем и датой.

например, у меня есть дата и время 2017-09-05 00:00:00.000 и строковое время 11:00. Я хочу одно поле в представлении 2017-09-05 11:00:00.000

Я попытался привести дату и время к дате, а затем объединить новое поле даты и строки даты вместе, но это не работает.

Чтобы указать дату и время, я использую: CAST(dtDate AS DATE) AS dtNewDate, который отлично работает. Когда я затем использую: CAST(dtNewDate + szTime AS datetime) AS dtNewDateTime, создание представления работает нормально, но выбор 1000 лучших возвращает «сбой преобразования при преобразовании даты и/или времени из символьной строки».

Есть ли более простой способ сделать это или кто-нибудь может предложить какой-нибудь совет (кроме сохранения даты и времени в одном поле даты и времени в первую очередь, поскольку оно заполняется сторонним приложением, которое у меня нет доступа для изменения)


person SayCodeWell    schedule 05.09.2017    source источник
comment
как выглядят 7 часов, 07:00 или 7:00?   -  person GuidoG    schedule 05.09.2017
comment
7 часов отображается как 07:00 в текстовом поле.   -  person SayCodeWell    schedule 05.09.2017
comment
Возможный дубликат SQL add Datetime add hour add Minute   -  person Tanner    schedule 05.09.2017


Ответы (5)


Предполагая, что 11:00 означает 11:00:00, вы можете сделать что-то вроде этого:

SELECT dtDate + CONVERT(DateTime, szTime, 108)
FROM...

Посмотрите живую демонстрацию на rextester

person Zohar Peled    schedule 05.09.2017

Вы можете добавить два значения datetime вместе, поэтому попробуйте:

CAST(dtDate AS DATETIME) + CAST(CAST(szTime AS TIME) as DATETIME)
person Gordon Linoff    schedule 05.09.2017
comment
Вы можете опустить приведение TIME11:00 будет преобразовано непосредственно в DATETIME (а именно, 1900-01-01 11:00). Тем не менее, этот трюк не работает для DATETIME2, что не очень хорошо, если вам нужна точность. - person Jeroen Mostert; 05.09.2017

Вы можете попробовать следующее.

DECLARE @YourDate AS DATETIME
SET @YourDate = CONVERT(VARCHAR(10), '2017-09-05 00:00:00.000', 111) + ' 11:00'
PRINT @YourDate
person Rajan    schedule 05.09.2017

другой способ - получить час из вашего строкового поля, преобразовать его в int и добавить его как часы к дате и времени.

declare @date datetime = '20170905'
declare @stringtime varchar(5) = '11:00'

select left(@stringtime, 2),
       dateadd(hour, convert(int, left(@stringtime, 2)), @date)

Если вам также нужны минуты, вы можете сделать это следующим образом:

declare @date datetime = '20170905'
declare @stringtime varchar(5) = '11:05'

select left(@stringtime, 2),
       right(@stringtime, 2),
       dateadd(minute, convert(int, right(@stringtime, 2)), dateadd(hour, convert(int, left(@stringtime, 2)), @date))

Это будет работать, только если строковое поле всегда имеет формат чч:мм

person GuidoG    schedule 05.09.2017
comment
как насчет секунд и долей секунды? - person Jodrell; 05.09.2017
comment
@Jodrell Я не рассказывал об этом, потому что они тоже не в вопросе. В ОП указано, что время указано в формате чч: мм. Я даже спросил об этом в комментарии - person GuidoG; 05.09.2017
comment
@Jodrell И я также выделен жирным шрифтом, что это будет работать только в том случае, если время указано в формате чч: мм. - person GuidoG; 05.09.2017