Объединение (конкатенирование) даты и времени в дату и время
Используя 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 имеет эту функцию