将时间变量放置到 smalldatetime 变量的最简单方法(仅时间部分保留日期)

Easiest way to place time variable to smalldatetime variable (only time part keeping the date)

我有两个变量

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)

SELECT REPLACE(REPLACE(REPLACE(@dt1,DATEPART(hour,@dt1),DATEPART(hour,@t1)),DATEPART(MINUTE,@dt1),DATEPART(MINUTE,@t1)),DATEPART(SECOND,@dt1),DATEPART(SECOND,@t1))

我个人会将它们转换为 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);

也许是这个?

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)

我会 cast() smalldatetimedate 来截断时间部分,然后返回 smalldatetime。然后你也可以 cast() 到其他时间组件到 smalldatetime ,并添加两个:

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

Demo on DB Fiddle:

| newdatetime      |
| :--------------- |
| 2020-07-30 13:00 |

您可以在当前 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