连接时间值以匹配行';s日期SQL Server

连接时间值以匹配行';s日期SQL Server,sql,sql-server,Sql,Sql Server,我有一条SQL语句,它只比较Datetime列中的时间。 如果满足条件,则需要更新列并将时间值连接到该行中的相应日期 下面是SQL语句 declare @first datetime set @first = '2016/10/10 06:47:16.123' declare @second datetime set @second = '2016/10/10 10:47:16.123' declare @myTime datetime set @myTime = '2016/10/10 00:

我有一条SQL语句,它只比较
Datetime
列中的时间。 如果满足条件,则需要更新列并将时间值连接到该行中的相应日期

下面是SQL语句

declare @first datetime
set @first = '2016/10/10 06:47:16.123'
declare @second datetime
set @second = '2016/10/10 10:47:16.123'
declare @myTime datetime
set @myTime = '2016/10/10 00:15:16.123'


 UPDATE Staff_Manager.dbo.Staff_Time_TBL        
        SET Time_Data_1 = CASE  
             WHEN CAST(Time_Data_1 AS time) 
             BETWEEN CAST(@first AS time) AND CAST(@second AS time) 
             THEN CAST(Date_Data AS date) + CAST(@myTime AS time)                        
        ELSE NULL       
        END
     WHERE Staff_No = 1903 AND Date_Data BETWEEN '2016/2/1' AND '2016/3/1'
满足条件后,我需要下面这一行从名为
date\u Data
(数据类型为
date
)的列中获取该行的日期,并将其仅与时间值连接到名为
time\u Data\u 1
(数据类型为
DATETIME
)的列中

现在我犯了一个错误

操作数数据类型日期对于add运算符无效


我相信这可以在2008年之前完成,但我使用的是SQL server 2014,您如何着手做类似的事情

日期是日期数据类型,时间是时间数据类型。您看到的是这些值的字符串,它看起来像一个日期时间数据类型,但对SQL Server来说它们是苹果和桔子

但是,如果将它们都规范化为您看到的内容(varchar字符串),则可以将该字符串转换为datetime:

    select convert(datetime, convert(varchar(10), @date) + ' ' + convert(varchar(12), @time))

添加时间时类型应相同,请重试

cast(cast(Date_Data as date) as datetime) + cast(CAST(@myTime AS time) as datetime)

在SQL Server 2012上,您可以执行以下操作:

   DATETIMEFROMPARTS ( 
   datepart(YEAR, Date_Data), 
   datepart(MONTH, Date_Data), 
   datepart(DAY, Date_Data), 
   datepart(HOUR, @myTime ), 
   datepart(MINUTE, @myTime), 
   datepart(SECOND, @myTime), 
   datepart(MILLISECOND, @myTime) 
    ) 
在早期版本上,您也可以使用此功能:

CREATE FUNCTION [dbo].[DATETIME2FROMPARTS](
  @year int,
  @month int,
  @day int,
  @hour int,
  @minute int,
  @second int,
  @fractions int,
  @precision int)
    RETURNS datetime2(7)
    AS
    BEGIN
    RETURN
    DATEADD(NANOSECOND, POWER(10, 9-@precision)*@fractions, 
    DATEADD(SECOND, @second, 
    DATEADD(MINUTE, @minute, 
    DATEADD(HOUR, @hour, 
    DATEADD(DAY, @day-1, 
    DATEADD(MONTH, @month-1, 
    DATEADD(YEAR, @year-1900, 
    CAST(CAST(0 AS datetime) AS datetime2(7)))))))));
    END 

你还需要一个cast来添加时间cast(cast(Date_Data as Date)as datetime)+cast(cast(@myTime as time)as datetime)@nazark,谢谢你修复了它。“现在开始工作了。”纳扎克,是的,我会投票并打分作为答案。谢谢你的帮助。我打算把答案投上一票,因为我已经让它发挥了一半的作用,但它确实产生了一些奇怪的结果。这就是我所做的,
Date\u Data
是一列,
convert(datetime,convert(varchar(10),Date\u Data)+''+convert(varchar(12),@myTime))
CREATE FUNCTION [dbo].[DATETIME2FROMPARTS](
  @year int,
  @month int,
  @day int,
  @hour int,
  @minute int,
  @second int,
  @fractions int,
  @precision int)
    RETURNS datetime2(7)
    AS
    BEGIN
    RETURN
    DATEADD(NANOSECOND, POWER(10, 9-@precision)*@fractions, 
    DATEADD(SECOND, @second, 
    DATEADD(MINUTE, @minute, 
    DATEADD(HOUR, @hour, 
    DATEADD(DAY, @day-1, 
    DATEADD(MONTH, @month-1, 
    DATEADD(YEAR, @year-1900, 
    CAST(CAST(0 AS datetime) AS datetime2(7)))))))));
    END