SQL 服务器 - Store/save DateDIFF 通过 SQL 服务器代理

SQL Server - Store/save DateDIFF via SQL server agent

我想通过更新查询将从查询中获取的差异存储到出勤table。到目前为止,我有一个 table 出勤,DateTime 有用户签到的日期和时间,我正在计算 'then' 日期时间与 'now' GetDate() 的差异。时间格式是 24 小时而不是 12 小时。

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 服务器中,我想更新 table 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

table 的最终结果应该如下所示:

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

从聊天中的讨论来看,问题似乎是

How can I update the [Hours] column in the [Attendance] table to 4 if the value in the column [DateTime] is 4 hours or more ago, without affecting records before today?

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

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

我同意这个解决方案并不优雅;不正确的数据类型包括许多可能的错误、隐含的转换和可伸缩性问题,并且它的某些方面是多余的,但 OP 很快提到他们只是将其用作 FYP 的一个小方面(Final Year Project ) 主要方面是 C#,所以我想尽可能少地更改他们的脚本,将其留作他们自己的工作。

OP脚本的快速修改:

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())