我想创建一个更新语句,该语句将运行比运行更新时间早30分钟的记录:
Update Orders
set ordertype = 'q'
where createddaytime <= DATEADD(mi, -30, GETDATE())
但是,我没有专栏createddaytime
。
我有一个createdate
列,存储在日期时间。我还有createtime
列,varchar(8)
。下午6:30将在专栏中显示为18.5。
如何使用这两列创建createdaytime
变量?
当我尝试在时间列上进行转换或转换时,我收到以下错误:
从字符串转换日期和/或时间时转换失败。
答案 0 :(得分:0)
不是理想的解决方案&amp;未经测试,但应该有效:
Update Orders
set ordertype = 'q'
where (convert(datetime, convert(varchar(10), createdate, 111) +' ' + createddaytime)) <= DATEADD(mi, -30, GETDATE())
注意:您必须将时间存储为DATETIME字段本身的一部分,即创建
答案 1 :(得分:0)
你可以尝试一下:
update orders
set ordertype = 'q'
where
cast(
cast(cast(createdate as date) as varchar(20)) + ' ' +
cast(floor(createtime) as char(2)) + ':' + cast(floor((createtime-floor(createtime))*60) as char(2)) + ':00'
as datetime) <= dateadd(mi, -30, getdate())
上图 - 我从日期时间开始逐渐减少,并以18:30:00的形式加入18.5小时以创建日期时间。
下面是一个关于SQLFiddle的示例:http://sqlfiddle.com/#!3/634e4/12并根据您的需要提供它。
create table orders (createdate datetime, createtime decimal(5,2));
insert into orders values ('2015-01-01 00:00:00', 18.5);
insert into orders values (getdate(), 18.5);
select
cast(
cast(cast(createdate as date) as varchar(20)) + ' ' +
cast(floor(createtime) as char(2)) + ':' + cast(floor((createtime-floor(createtime))*60) as char(2)) + ':00'
as datetime) as fld1
from orders;
结果:
| fld1 |
|----------------------------|
| January, 01 2015 18:30:00 |
| November, 30 2015 18:30:00 |
答案 2 :(得分:0)
这样的事可能会奏效:
-- Formatted to avoid scroll bar
Update Orders
set ordertype = 'q'
where
-- Cast the time to a number, multiply by 60 and add that to the date
DATEADD(minute, CAST(createtime AS DECIMAL(5,3)) * 60, createdate)
<= DATEADD(minute, -30, SYSUTCDATETIME())
请记住,使用此方法创建日期为truncated to the minute(下午6:30.59变为下午6:30.00)。我的方法也假设您提到的形式的清洁数据(18.5为下午6:30)。