[英]Concatenate time value to match row's Date SQL Server
我有一个SQL语句,仅比较Datetime
列中的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_Data
(数据类型为DATE
)的列,并将其与一个时间值连接到一个名为Time_Data_1
(数据类型为DATETIME
)的列中
THEN CAST(Date_Data AS date) + CAST(@myTime AS time)
目前,我遇到了一个错误,
操作数数据类型日期对于加法运算符无效。
我相信这是可以在2008年之前完成的,但是我在SQL Server 2014上,您如何去做这样的事情。
输入时间时类型应相同,请尝试
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
好吧,日期是日期数据类型,时间是时间数据类型。 您正在查看这些值的字符串,这些字符串看起来像日期时间数据类型,但是对于SQL Server来说它们是苹果和橘子。
但是,如果将它们都标准化为您所看到的内容(varchar字符串),则可以将该字符串转换为日期时间:
select convert(datetime, convert(varchar(10), @date) + ' ' + convert(varchar(12), @time))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.