Самый простой способ поместить переменную времени в переменную smalldatetime (только часть времени сохраняет дату) - PullRequest
0 голосов
/ 03 августа 2020

У меня есть две переменные

declare @dt1 smalldatetime = '2020-07-30 10:00:00'
declare @t1 time = '13:00:00'

Как проще всего поставить t1 на dt1, чтобы получить '2020-07-30 13:00:00' (без потери 2020-07-30)

Ответы [ 5 ]

1 голос
/ 03 августа 2020

Я бы сделал cast() от smalldatetime до date, чтобы усечь компонент времени, а затем обратно до smalldatetime. Затем вы можете просто cast() в другой компонент времени в smalldatetime и добавить оба:

select 
    cast(cast(@dt1 as date) as smalldatetime) 
    + cast(@t1 as smalldatetime) as newdatetime

Демо на DB Fiddle :

| newdatetime      |
| :--------------- |
| 2020-07-30 13:00 |
0 голосов
/ 03 августа 2020

Вы можете добавить три часа к текущему SMALLDATETIME или создать новый, объединив желаемые части:

DECLARE @dt1 SMALLDATETIME = '2020-07-30 10:00:00'
DECLARE @t1 TIME = '13:00:00'

SELECT
    @dt1 AS "source",
    DATEADD(HOUR, 3, @dt1) AS "three hours added",  -- just add three hours
    CONVERT(SMALLDATETIME,  -- concatenate the desired parts and convert
        DATETIMEFROMPARTS(DATEPART(YEAR, @dt1),
                        DATEPART(MONTH, @dt1),
                        DATEPART(DAY, @dt1),
                        DATEPART(HOUR, @t1),
                        DATEPART(MINUTE, @t1),
                        DATEPART(SECOND, @t1),
                        0)
    ) AS "concatenated parts"

Результаты:

source              |three hours added      |concatenated parts
----------------------------------------------------------------
2020-07-30 10:00:00 |2020-07-30 13:00:00    |2020-07-30 13:00:00
0 голосов
/ 03 августа 2020

Я бы лично конвертировал их в значения ISO varchar, объединял и конвертировал обратно:

DECLARE @dt1 smalldatetime = '2020-07-30T10:00:00';
DECLARE @t1 time = '13:00:00';

SELECT CONVERT(smalldatetime,CONVERT(varchar(10),@dt1,126) + 'T' + CONVERT(varchar(8),@t1,114),126);
0 голосов
/ 03 августа 2020

Может это?

declare @dt1 smalldatetime = '2020-07-30 10:00:00'
declare @t1 time = '13:00:00'


SELECT CAST(LEFT(CONCAT(CAST(@dt1 AS DATE), 'T', @t1), 19) AS SMALLDATETIME)
0 голосов
/ 03 августа 2020
SELECT REPLACE(REPLACE(REPLACE(@dt1,DATEPART(hour,@dt1),DATEPART(hour,@t1)),DATEPART(MINUTE,@dt1),DATEPART(MINUTE,@t1)),DATEPART(SECOND,@dt1),DATEPART(SECOND,@t1))
...