Подтвердить что ты не робот

Как совместить дату из одного поля со временем из другого поля - MS SQL Server

В выписке, с которой я имею дело, у меня есть 2 datetime столбца. Один столбец хранит даты, а другой - время, как показано.

Как я могу запросить таблицу для объединения этих двух полей в 1 столбец типа datetime?

Дата

2009-03-12 00:00:00.000
2009-03-26 00:00:00.000
2009-03-26 00:00:00.000

Времена

1899-12-30 12:30:00.000
1899-12-30 10:00:00.000
1899-12-30 10:00:00.000
4b9b3361

Ответ 1

Вы можете просто добавить два.

  • если Time part вашего столбца Date всегда равен нулю
  • и Date part вашего столбца Time также всегда равен нулю (базовая дата: 1 января 1900 г.)

Добавление их возвращает правильный результат.

SELECT Combined = MyDate + MyTime FROM MyTable

Обоснование (благодарность ErikE/dnolan)

Это работает так, потому что дата хранится как два 4-байтовых Integers с левыми 4 байтами, являющимися date, и правыми 4 байта являются time. Это как делать $0001 0000 + $0000 0001 = $0001 0001

Изменить новые типы SQL Server 2008

Date и Time являются типами, представленными в SQL Server 2008. Если вы настаиваете на добавлении, вы можете использовать Combined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)

Edit2 относительно потери точности в SQL Server 2008 и более поздних версиях (слава Мартину Смиту)

Посмотрите Как объединить дату и время с datetime2 в SQL Server?, чтобы предотвратить потерю точности при использовании SQL Server 2008 и более поздних версий.

Ответ 2

Если элемент времени столбца даты и элемент даты вашего столбца времени равны нулю, то Ответ на вопрос Lieven - это то, что вам нужно. Если вы не можете гарантировать, что это всегда будет иметь место, тогда он становится несколько более сложным:

SELECT DATEADD(day, 0, DATEDIFF(day, 0, your_date_column)) +
    DATEADD(day, 0 - DATEDIFF(day, 0, your_time_column), your_time_column)
FROM your_table

Ответ 3

Это альтернативное решение без каких-либо преобразований char:

DATEADD(ms, DATEDIFF(ms, '00:00:00', [Time]), CONVERT(DATETIME, [Date]))

Вы получите только миллисекундную точность, но это нормально. Я тестировал это в SQL Server 2008.

Ответ 4

Это сработало для меня

CAST(Tbl.date as DATETIME) + CAST(Tbl.TimeFrom AS TIME)

(на SQL 2008 R2)

Ответ 5

Если вы не используете SQL Server 2008 (т.е. у вас есть только тип данных DateTime), вы можете использовать следующий (предположительно грубый и готовый) TSQL для достижения того, что вы хотите:

DECLARE @DateOnly AS datetime
DECLARE @TimeOnly AS datetime 

SET @DateOnly = '07 aug 2009 00:00:00'
SET @TimeOnly = '01 jan 1899 10:11:23'


-- Gives Date Only.
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly))

-- Gives Time Only.
SELECT DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly)

-- Concatenates Date and Time parts.
SELECT
CAST(
    DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly)) + ' ' +
    DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly)           
as datetime)

Это грубо и готово, но оно работает!

Ответ 6

  • Если оба поля являются датами, то просто добавление их будет работать.

    например:

    Declare @d datetime, @t datetime
    set @d = '2009-03-12 00:00:00.000';
    set @t = '1899-12-30 12:30:00.000';
    select @d + @t
    
  • Если вы использовали тип данных даты и времени, просто введите время в datetime

    например:

    Declare @d date, @t time
    set @d = '2009-03-12';
    set @t = '12:30:00.000';
    select @d + cast(@t as datetime)
    

Ответ 7

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

Convert(datetime, Convert(char(10), MYDATETIMEFIELD, 103) + ' ' + Convert(char(8), MYTIMEFIELD, 108), 103) 

Ответ 8

DECLARE @Dates table ([Date] datetime);
DECLARE @Times table ([Time] datetime);

INSERT INTO @Dates VALUES('2009-03-12 00:00:00.000');
INSERT INTO @Dates VALUES('2009-03-26 00:00:00.000');
INSERT INTO @Dates VALUES('2009-03-30 00:00:00.000');

INSERT INTO @Times VALUES('1899-12-30 12:30:00.000');
INSERT INTO @Times VALUES('1899-12-30 10:00:00.000');
INSERT INTO @Times VALUES('1899-12-30 10:00:00.000');

WITH Dates (ID, [Date])
AS (
    SELECT ROW_NUMBER() OVER (ORDER BY [Date]), [Date] FROM @Dates
), Times (ID, [Time])
AS (
    SELECT ROW_NUMBER() OVER (ORDER BY [Time]), [Time] FROM @Times
)
SELECT Dates.[Date] + Times.[Time] FROM Dates
    JOIN Times ON Times.ID = Dates.ID

Печать

2009-03-12 10:00:00.000
2009-03-26 10:00:00.000
2009-03-30 12:30:00.000

Ответ 9

SELECT CAST(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table

Работает как шарм

Ответ 10

Преобразуйте оба поля в DATETIME:

SELECT CAST(@DateField as DATETIME) + CAST(@TimeField AS DATETIME)

и если вы используете Getdate(), используйте это сначала:

DECLARE @FechaActual DATETIME = CONVERT(DATE, GETDATE());
SELECT CAST(@FechaActual as DATETIME) + CAST(@HoraInicioTurno AS DATETIME)

Ответ 11

У меня было много ошибок, как указано выше, поэтому я сделал это как

try_parse(concat(convert(date,Arrival_date),' ',arrival_time) as datetime) AS ArrivalDateTime

Это сработало для меня.

Ответ 12

Другой способ - использовать CONCAT и CAST, помните, что вам нужно использовать DATETIME2(x) чтобы заставить его работать. Вы можете установить x на что угодно между 0-7 7 означает отсутствие потери точности.

DECLARE @date date = '2018-03-12'
DECLARE @time time = '07:00:00.0000000'
SELECT CAST(CONCAT(@date, ' ', @time) AS DATETIME2(7))

Возврат 2018-03-12 07:00:00.0000000

Протестировано на SQL Server 14

Ответ 13

Чтобы совместить дату из столбца datetime и времени из другого столбца datetime, это самое быстрое для вас решение:

select cast(cast(DateColumn as date) as datetime) + cast(TimeColumn as datetime) from YourTable

Ответ 14

SELECT CAST (CAST (@DateField As Date) как DateTime) + CAST (CAST (@TimeField As Time) As DateTime)

Ответ 15

Я столкнулся с подобной ситуацией, когда мне пришлось объединить поля Date и Time с полем DateTime. Ни одно из вышеупомянутых решений не работает, особенно добавление двух полей, так как тип данных для добавления этих двух полей не совпадает.

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

с тбл как (   выберите StatusTime = '12/30/1899 5:17:00 PM ', StatusDate =' 24.07.2009, 12:00:00 AM ' ) выберите DATEADD (MI, DATEPART (MINUTE, CAST (tbl.StatusTime AS TIME)), DATEADD (HH, DATEPART (HOUR, CAST (tbl.StatusTime AS TIME)), CAST (tbl.StatusDate as DATETIME)) из таблицы

Результат: 2019-07-24 17: 17: 00.000