Sql server 用自定义时间替换时间部分

Sql server 用自定义时间替换时间部分,sql-server,sql-server-2008,datetime,sql-server-2005,Sql Server,Sql Server 2008,Datetime,Sql Server 2005,我有一个场景,其中我必须匹配系统时间,但我必须使用sql server中预设的saved datetime变量匹配当前时间 DECLARE @SyncDate AS DATETIME DECLARE @SystemDate AS DATETIME SELECT @SyncDate = dbo.TimeTable.auto_time FROM dbo.TimeTable '1900-01-01 03:00 SELECT @SystemDate = GETDATE() 我必须用当

我有一个场景,其中我必须匹配系统时间,但我必须使用sql server中预设的saved datetime变量匹配当前时间

DECLARE @SyncDate AS DATETIME
DECLARE @SystemDate AS DATETIME
SELECT  @SyncDate = dbo.TimeTable.auto_time    
FROM    dbo.TimeTable
'1900-01-01 03:00
SELECT  @SystemDate = GETDATE()
我必须用当前日期和已保存的时间替换
@SyncDate
,即:

2015-11-16 03:00

任何主体都可以提供帮助?

您可以直接在SQL Server 2008+中的
日期时间
值中添加
时间
值。但是对于SQL Server 2005,您可以使用
DATETIME
操作,例如
DATEADD
DATEDIFF

对于SQL Server 2008:

DECLARE @SyncDate DATETIME = CAST('1900-01-01 03:00' AS DATETIME)

SELECT 
    CAST(CAST(GETDATE() AS DATE) AS DATETIME) + CAST(@SyncDate AS TIME)
对于SQL Server 2005:

DECLARE @SyncDate DATETIME 
SET @SyncDate = CAST('1900-01-01 03:00' AS DATETIME)

SELECT 
    DATEADD(
        MILLISECOND, 
        DATEDIFF(MILLISECOND, CAST(@SyncDate AS DATE), @SyncDate), 
        CAST(CAST(GETDATE() AS DATE) AS DATETIME)
    )
您可以使用:

DECLARE @SyncDate AS DATETIME = GETDATE();
DECLARE @SystemDate AS DATETIME = '1900-01-01 03:00' --saved time

SELECT DATEADD(day, DATEDIFF(day,'19000101',CAST(@SyncDate AS DATE)), CAST(CAST(@SystemDate AS TIME) AS DATETIME));
DECLARE @SyncDate AS DATETIME = GETDATE();
DECLARE @SystemDate AS DATETIME = '1900-01-01 03:00'

SELECT DATEADD(day, DATEDIFF(day,'19000101',CAST(@SyncDate AS DATE)), @SystemDate);

输出:

2015-11-16 03:00:00
如果保存的时间始终为
1900-01-01 hh:mm:ss
格式,则可以使用:

DECLARE @SyncDate AS DATETIME = GETDATE();
DECLARE @SystemDate AS DATETIME = '1900-01-01 03:00' --saved time

SELECT DATEADD(day, DATEDIFF(day,'19000101',CAST(@SyncDate AS DATE)), CAST(CAST(@SystemDate AS TIME) AS DATETIME));
DECLARE @SyncDate AS DATETIME = GETDATE();
DECLARE @SystemDate AS DATETIME = '1900-01-01 03:00'

SELECT DATEADD(day, DATEDIFF(day,'19000101',CAST(@SyncDate AS DATE)), @SystemDate);

我已经完成了一个通用查询,即自由格式版本检查或版本依赖

DECLARE @SyncDate AS DATETIME = '1900-01-01 03:00'
DECLARE @SystemDate AS DATETIME = GETDATE() ;

SELECT  @SyncDate = DATEADD(dd, 0, DATEDIFF(dd, 0, @SystemDate))
    + CONVERT(VARCHAR(8), @SyncDate, 108)
SELECT  @SyncDate

对于SqlServer 2016,2020年在座的人员:

DECLARE @SyncDate DATETIME = CAST('1900-01-01 03:00' AS DATETIME)

SELECT 
    CAST(CAST(GETDATE() AS DATE) AS DATETIME) + CAST(@SyncDate AS DATETIME)
输出

2020-11-26 03:00:00.0

PS:查询是在2020年11月26日运行的。

什么版本的sql server?sql server 2008,2005尝试以下操作:
选择CAST(CAST(GETDATE()AS DATE)AS DATETIME)+CAST(@SyncDate AS TIME)
@FelixPamittan:这将在sql server 2008及更新版本中运行-但在2005年将失败,因为
DATE
TIME
在2005年是未知类型(仅在2008年推出)@marc_s,是的。我在下面添加了一个适用于2005年的答案。什么是不工作。请确保在2005年运行SQL Server 2008版本时删除它。请参阅我的编辑。