Как объединить дату из одного поля со временем из другого поля - MS SQL Server - PullRequest
184 голосов
/ 31 марта 2009

В выдержке, с которой я имею дело, у меня есть 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

Ответы [ 14 ]

240 голосов
/ 31 марта 2009

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

  • если 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 и более поздних версий.

126 голосов
/ 31 марта 2009

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

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
23 голосов
/ 30 ноября 2011

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

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

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

11 голосов
/ 06 февраля 2013

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

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

(в SQL 2008 R2)

9 голосов
/ 27 апреля 2010
  1. Если оба ваших поля имеют дату и время, просто добавьте их.

    Например:

    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
    
  2. Если вы использовали тип данных Дата и время, просто приведите время к дате и времени

    например:

    Declare @d date, @t time
    set @d = '2009-03-12';
    set @t = '12:30:00.000';
    select @d + cast(@t as datetime)
    
9 голосов
/ 31 марта 2009

Если вы не используете 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)

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

3 голосов
/ 20 октября 2009

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

Convert(datetime, Convert(char(10), MYDATETIMEFIELD, 103) + ' ' + Convert(char(8), MYTIMEFIELD, 108), 103) 
1 голос
/ 30 августа 2017

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

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

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

1 голос
/ 02 января 2017

Преобразовать оба поля в 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)
1 голос
/ 13 декабря 2016
SELECT CAST(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...