如何使用2列(日期)和(varchar)创建日期时间变量

时间:2015-11-30 02:25:44

标签: sql-server datetime

我想创建一个更新语句,该语句将运行比运行更新时间早30分钟的记录:

Update Orders
set ordertype = 'q'
where createddaytime <= DATEADD(mi, -30, GETDATE())

但是,我没有专栏createddaytime。 我有一个createdate列,存储在日期时间。我还有createtime列,varchar(8)。下午6:30将在专栏中显示为18.5。

如何使用这两列创建createdaytime变量? 当我尝试在时间列上进行转换或转换时,我收到以下错误:

  

从字符串转换日期和/或时间时转换失败。

3 个答案:

答案 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)。