Объединение (конкатенирование) даты и времени в дату и время

Используя SQL Server 2008, этот запрос отлично работает:

select CAST(CollectionDate as DATE), CAST(CollectionTime as TIME)
from field

Дает мне два столбца:

2013-01-25  18:53:00.0000000
2013-01-25  18:53:00.0000000
2013-01-25  18:53:00.0000000
2013-01-25  18:53:00.0000000
    .
    .
    .

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

select CAST(CollectionDate as DATE) + CAST(CollectionTime as TIME)
from field

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

Msg 8117, уровень 16, состояние 1, строка 1
Дата добавления даты оператора недействительна для оператора добавления.

Все поля отличны от нуля и не равны нулю. Я также попробовал функцию CONVERT и попытался применить эти результаты как varchars, такую ​​же проблему. Это не может быть так сложно, как я это делаю.

Может кто-нибудь сказать мне, почему это не работает? Спасибо за любую помощь.

Ответы

Ответ 1

Предполагая, что основными типами данных являются дата/время/время и т.д.

SELECT CONVERT(DATETIME, CONVERT(CHAR(8), CollectionDate, 112) 
  + ' ' + CONVERT(CHAR(8), CollectionTime, 108))
  FROM dbo.whatever;

Если это не так, ПОЧЕМУ НЕ, и для получения содержательного ответа вам нужно сообщить нам, какие типы они есть и в каком формате хранятся данные. Или просто исправить таблица.

Ответ 2

Вместо datetime выберите

select CAST(CollectionDate as DATETIME) + CAST(CollectionTime as TIME)
from field

Это работает на SQL Server 2008 R2.

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

Ответ 3

Простое решение

SELECT CAST(CollectionDate as DATETIME) + CAST(CollectionTime as DATETIME)
FROM field

Ответ 4

Более легкое решение (проверено на SQL Server 2014 SP1 CU6)

Код:

DECLARE @Date date = SYSDATETIME();

DECLARE @Time time(0) = SYSDATETIME();

SELECT CAST(CONCAT(@Date, ' ', @Time) AS datetime2(0));

Это также будет работать с таблицей с определенной датой и конкретным временным полем. Я часто использую этот метод, учитывая, что у нас есть данные поставщика, которые используют дату и время в двух отдельных полях.

Ответ 5

DECLARE @ADate Date, @ATime Time, @ADateTime Datetime

SELECT @ADate = '2010-02-20', @ATime = '18:53:00.0000000'

SET @ADateTime = CAST   (
    CONVERT(Varchar(10), @ADate, 112) + ' ' +   
    CONVERT(Varchar(8), @ATime) AS DateTime)

SELECT @ADateTime [A nice datetime :)]

Это даст вам действительный результат.

Ответ 6

drop table test

create table test(
    CollectionDate date NULL,
    CollectionTime  [time](0) NULL,
    CollectionDateTime as (isnull(convert(datetime,CollectionDate)+convert(datetime,CollectionTime),CollectionDate))
-- if CollectionDate is datetime no need to convert it above
)

insert test (CollectionDate, CollectionTime)
values ('2013-12-10', '22:51:19.227'),
       ('2013-12-10', null),
       (null, '22:51:19.227')

select * from test

CollectionDate  CollectionTime  CollectionDateTime
2013-12-10      22:51:19        2013-12-10 22:51:19.000
2013-12-10      NULL            2013-12-10 00:00:00.000
NULL            22:51:19        NULL

Ответ 7

Это работает в SQL 2008 и 2012 для создания datetime2:

declare @date date = current_timestamp;
declare @time time = current_timestamp;

select 
@date as date
,@time as time
,cast(@date as datetime) + cast(@time as datetime) as datetime
,cast(@time as datetime2) as timeAsDateTime2
,dateadd(dayofyear,datepart(dayofyear,@date) - 1,dateadd(year,datepart(year,@date) - 1900,cast(@time as datetime2))) as datetime2;

Ответ 8

при работе с датами dateadd должен быть использован для точности

declare @a DATE = getdate()
declare @b time(7) = getdate()
select @b, @A, GETDATE(), DATEADD(day, DATEDIFF(day, 0, @a), cast(@b as datetime2(0)))

Ответ 9

Я использую SQL Server 2016, и оба поля myDate и myTime являются строками. Приведенный ниже оператор tsql работал над объединением их в datetime

select cast((myDate + ' ' + myTime) as datetime) from myTable

Ответ 10

SELECT CONVERT(DATETIME, CONVERT(CHAR(8), date, 112) + ' ' + CONVERT(CHAR(8), time, 108))
  FROM tablename

Ответ 11

Использование Concat Mysql имеет эту функцию