2016-06-24 97 views
0

我想通过更新查询将查询中提取的差异存储到考勤表中。到目前为止,我有一个表考勤和日期时间有用户登记的日期和时间,我正在计算与'现在'GetDate()的'那么'日期时间的差异。时间格式是24小时不是12小时。SQL Server - 通过SQL服务器代理存储/保存DateDIFF

AttendanceId UserId AttendanceStatus Hours CheckIn/Out DateTime 
--------------------------------------------------------------------- 
    1   22   Present  0  In  2016-6-23 5:30:00 
    2   23   Present  0  In  2016-6-23 5:30:00 
    3   24   Present  0  In  2016-6-23 5:30:00 
    4   25   Present  0  In  2016-6-23 5:30:00 

为此,我使用

Select [DateTime], 
DATEDIFF(MI, (SELECT IIF(ISDATE([DateTime]) = 1, CONVERT(DATETIME, [DateTime], 111), [DateTime]) as DT_Attendance), GETDATE())/60.0 as Hours_Difference 
from 
Attendance where CheckInCheckOut = 'In' 
and [DateTime] = CONVERT(date, getdate()) 

此查询是输出我有:现在

Datetime  Hours_Difference 
--------------------------------- 
2016-6-23   1.20233434 
2016-6-23   1.20233434 

,在SQL Server中,我想更新表Attendance并存储该值'4'在列Hours的所有行中分别为Hours_Difference = 4 or >4,这里(假设)差别是:

Datetime   Hours_Difference 
---------------------------------------- 
2016-6-23 5:30:00   4.00000000 
2016-6-23 5:30:00   5.50323134 

表的最终结果应该是这样的:

AttendanceId UserId AttendanceStatus Hours CheckIn/Out DateTime 
--------------------------------------------------------------------- 
    1   22   Present  4  In  2016-6-23 5:30:00 
    2   23   Present  4  In  2016-6-23 5:30:00 
    3   24   Present  4  In  2016-6-23 5:30:00 
    4   25   Present  4  In  2016-6-23 5:30:00 
+1

我已阅读本约6-7倍,它只是没有任何意义。我必须问,虽然....为什么你有一个名为DateTime的列不是日期时间数据类型?您必须检查该值是否是有效的日期时间。这就是datetime数据类型的意义所在,所以你不必做所有这些疯狂事情。你会将整数存储在varchar中吗?我不明白为什么这么多人将日期作为角色数据存储。真的,你应该避免保留字作为列名。 –

+0

既然你已经知道'IIF'(这导致你的标签'mysql'在这里是错误的),我不确定你在找什么。 IFF(Hours_Difference> 4,round(Hours_Difference,0),Hours_Difference)'? – Solarflare

+0

@SeanLange因为,我搜索了谷歌,并没有帮助Sql DateTime支持在C#中使用DateTime like“”+ DateTime.Now。ToString(“yyyy-MM-dd”)+“%' – ARr0w

回答

1

从聊天讨论,这个问题似乎是

我怎样才能更新[时间]列的[如果[DateTime]列中的值是4小时或更久以前,而不影响今天之前的记录,则将[出勤率]表格设置为4?

Sean Lange指出,这很复杂,[DateTime]存储为字符串而不是日期时间数据类型。

这需要OP的脚本中的ISDATE函数,但最终OP找到了他们喜欢的解决方案。

我同意这个解决方案并不优雅;不正确的数据类型包含大量可能的错误,隐含的转换和可伸缩性问题,并且其中有些方面是多余的,但OP很快提及他们仅将其用作第一个五年计划(Final Year Project)的一个小方面),主要方面是C#,所以我想尽可能少地改变它们的脚本,将它们作为自己的工作。

快速修改业务方案的脚本:

UPDATE 
    Attendance 
SET 
    Hours = 4 
WHERE 
    -- The difference in dates in minutes between... 
    DATEDIFF(MINUTE, 

       -- ... DateTime (with a quick data check)... 
       (IIF(ISDATE([DateTime]) = 1, 
       CONVERT(DATETIME, [DateTime], 111), 
       [DateTime])) 

      -- ... and right now. 
      , GetDate() 

      -- Divided by 60 to get 
      )/60.0 >= 4 

-- DateTime has to be equal to today (relying on implicit conversion). 
and [DateTime] = convert(Date, GETDATE()) 
+0

感谢您的方式^ _ ^的帮助,感谢! – ARr0w