2017-08-28 141 views
0

我有一个包含大量用户日期时间记录的表(timbrature),我只舍入23:31和23:59到第二天00:00之间的值。 我想出了这个查询与网络的帮助:在给定的条件下舍入所有日期时间记录

DATAO是日期时间字段 iddip它的相对用户

declare @dt datetime 
set @dt = (select DATAO from timbrature where IDDIP=11) 
update timbrature set datao= (select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)) where IDDIP=11 

如预期的查询工作有关旋绕部的ID(以我省略了where子句检查时间范围的示例),但是我怎样才能遍历所有记录?谢谢

+0

删除第二个'WHERE IDDIP = 11',它会更新整个表 – cdsln

+0

即非标准SQL。你正在使用哪个DBMS? –

回答

0

你不需要临时var,只需在你的where子句中使用datepart并直接从DATAO列中获取时间。

declare @timbrature table (DATAO datetime, IDDIP int) 
insert into @timbrature 
select '2017-01-01 04:00:00.000',1 union 
select '2017-01-01 23:30:00.000',2 union 
select '2017-01-01 23:31:00.000',3 union 
select '2017-01-01 23:59:00.000',4 union 
select '2017-01-01 00:00:00.000',5 

update @timbrature 
set DATAO= dateadd(hour, datediff(hour, 0, dateadd(mi, 30, DATAO)), 0) 
from @timbrature 
where datepart(hour,DATAO)=23 and datepart(minute,DATAO)>30 

select * from @timbrature order by IDDIP 

其结果将是

DATAO     IDDIP 
----------------------- ----------- 
2017-01-01 04:00:00.000 1 
2017-01-01 23:30:00.000 2 
2017-01-02 00:00:00.000 3 
2017-01-02 00:00:00.000 4 
2017-01-01 00:00:00.000 5 
+0

干净整洁,我学到了新东西,谢谢! –

相关问题