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())
我想通过更新查询将从查询中获取的差异存储到出勤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())