Как объединить дату из одного поля со временем из другого поля-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
828   13  

13 ответов:

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

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

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

SELECT Combined = MyDate + MyTime FROM MyTable

обоснование (престижность ErikE / dnolan)

It works like this due to the way the date is stored as two 4-byte `Integers` with the
left 4-bytes being the `date` and the right 4-bytes being the `time`.  

Its like doing 01 0000 + 00 0001 = 01 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 и выше.

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

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

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

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

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

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

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

(на SQL 2008 R2)

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

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

  1. если оба ваших поля являются datetime, то просто добавление их будет работать.

    например:

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

    например:

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

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

Convert(datetime, Convert(char(10), MYDATETIMEFIELD, 103) + ' ' + Convert(char(8), MYTIMEFIELD, 108), 103) 
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

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

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

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

преобразовать оба поля в 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)
SELECT CAST(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table

работает

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

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

выберите CAST(CAST (@DateField As Date) As DateTime) + CAST(CAST(@TimeField As Time) As DateTime)

Comments

    Ничего не найдено.