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

Опираясь на предложение Антонио Скури, которое не было полностью явным, я решил, что код должен читать:

function MakeAnIupBox
    --make some more elements here
    listPlace = iup.list{}
    listPlace.sort = "YES"
    listPlace.dropdown = "YES" 
    --populate the list here
    --now handle callbacks
    listPlace.action = function(self, text, item, state) PlaceAction(listPlace, text, item,  state) end
end

function PlaceAction(ih, text, item, state)
    listAddress.REMOVEITEM = "ALL"
    if state == 1 then -- a place has been selected
    --code here to populate the Addresses list
    end
end
188
задан ErikE 16 April 2013 в 08:19
поделиться

7 ответов

Можно просто добавить два.

  • если 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 и (благодарность Martin Smith)

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

245
ответ дан Liam 23 November 2019 в 05:42
поделиться

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

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

9
ответ дан CraigTP 23 November 2019 в 05:42
поделиться
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
1
ответ дан Konstantin Tarkus 23 November 2019 в 05:42
поделиться

Если фактор времени Вашего столбца даты и элемент даты Вашего столбца времени являются оба нулем затем, ответ 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
127
ответ дан Community 23 November 2019 в 05:42
поделиться

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

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

; при tbl as (выберите StatusTime = '12 / 30/1899 5:17:00 PM ', StatusDate =' 24.07.2009 12:00:00 ') выберите 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

-1
ответ дан 23 November 2019 в 05:42
поделиться

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

Convert(datetime, Convert(char(10), MYDATETIMEFIELD, 103) + ' ' + Convert(char(8), MYTIMEFIELD, 108), 103) 
3
ответ дан 23 November 2019 в 05:42
поделиться
  1. Если оба ваших поля - datetime, тогда просто добавление их будет работать.

    например:

     Объявить @d datetime, @t datetime 
    установить @d = '2009-03-12 00: 00: 00.000'; 
    установить @t = '1899- 12-30 12:30:00.000 '; 
    select @d + @t 
     
  2. Если вы использовали тип данных Date & Time, просто приведите время к datetime

    например:

     Declare @d date, @ t time 
    set @d = '2009-03-12'; 
    set @t = '12: 30: 00.000 '; 
    выберите @d + cast (@t as datetime) 
     
9
ответ дан 23 November 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: