我的任务是更新位于SQL 2005数据库中的表中的几个字段。我目前正在使用vb.net 2010(.net 4),我还在学习这些东西,所以请保持温和。如果我错过了什么让我知道,我会尽快得到它。对不起,这太长了,但我很难创建一个描述。
除了包含的表格中显示的字段外,还有其他一些字段,但在整体方案中并不重要。此表用于人工跟踪,因此操作员/用户登录到作业,并填充以下字段:EmployeeWorkID(主键),EmployeeID(从单独的表派生),LoginDatetime(日期时间戳)和状态。填充db表的真实世界示例:
运行应用程序之前的表:
EmplWorkID EmplID LoginDateTime LogoutDateTime Status LoggedIn LoggedOut
93464 376 2013-01-31 15:00 2013-01-31 17:25 C 0 0
93466 376 2013-01-31 17:26 2013-01-31 23:00 C 0 0
93468 376 2013-02-01 15:00 2013-02-01 23:00 C 0 0
93484 380 2013-02-01 07:00 2013-02-01 09:17 C 0 0
93485 380 2013-02-01 09:18 2013-02-01 11:22 C 0 0
93486 380 2013-02-01 11:23 NULL A 0 0
93479 385 2013-01-31 07:03 2013-01-31 09:32 C 0 0
93481 385 2013-01-31 09:33 NULL A 0 0
93473 385 2013-02-01 07:05 2013-02-01 09:13 C 0 0
93482 385 2013-02-01 09:14 2013-02-01 11:34 C 0 0
93480 385 2013-02-01 11:35 2013-02-01 13:41 C 0 0
93483 385 2013-02-01 13:42 2013-02-01 15:03 C 0 0
93478 394 2013-01-31 23:03 2013-02-01 00:53 C 0 0
93475 394 2013-02-01 00:54 2013-02-01 03:26 C 0 0
93476 394 2013-02-01 03:27 2013-02-01 05:39 C 0 0
93477 394 2013-02-01 05:44 2013-02-01 07:03 C 0 0
首次运行后的表:
EmplWorkID EmplID LoginDateTime LogoutDateTime Status LoggedIn LoggedOut
93464 376 2013-01-31 15:00 2013-01-31 17:25 C 1 0
93466 376 2013-01-31 17:26 2013-01-31 23:00 C 0 1
93468 376 2013-02-01 15:00 2013-02-01 23:00 C 1 1
93484 380 2013-02-01 07:00 2013-02-01 09:17 C 1 0
93485 380 2013-02-01 09:18 2013-02-01 11:22 C 0 0
93486 380 2013-02-01 11:23 2013-02-01 15:00 C 0 1
93479 385 2013-01-31 07:00 2013-01-31 09:32 C 1 0
93481 385 2013-01-31 09:33 2013-01-31 15:00 C 0 1
93473 385 2013-02-01 07:00 2013-02-01 09:13 C 1 0
93482 385 2013-02-01 09:14 2013-02-01 11:34 C 0 0
93480 385 2013-02-01 11:35 2013-02-01 13:41 C 0 0
93483 385 2013-02-01 13:42 2013-02-01 15:00 C 0 1
93478 394 2013-01-31 23:00 2013-02-01 00:53 C 1 0
93475 394 2013-02-01 00:54 2013-02-01 03:26 C 0 0
93476 394 2013-02-01 03:27 2013-02-01 05:39 C 0 0
93477 394 2013-02-01 05:44 2013-02-01 07:00 C 0 1
第二次运行后的表:
EmplWorkID EmplID LoginDateTime LogoutDateTime Status LoggedIn LoggedOut
93464 376 2013-01-31 15:00 2013-01-31 17:25 C 1 0
93466 376 2013-01-31 15:00 2013-01-31 23:00 C **1** 1
93468 376 2013-02-01 15:00 2013-02-01 23:00 C 1 1
93484 380 2013-02-01 07:00 2013-02-01 09:17 C 1 0
93485 380 2013-02-01 07:00 2013-02-01 11:22 C **1** 0
93486 380 2013-02-01 11:23 2013-02-01 15:00 C 0 1
93479 385 2013-01-31 07:00 2013-01-31 09:32 C 1 0
93481 385 2013-01-31 07:00 2013-01-31 15:00 C **1** 1
93473 385 2013-02-01 07:00 2013-02-01 09:13 C 1 0
93482 385 2013-02-01 07:00 2013-02-01 11:34 C **1** 0
93480 385 2013-02-01 11:35 2013-02-01 13:41 C 0 0
93483 385 2013-02-01 13:42 2013-02-01 15:00 C 0 1
93478 394 2013-01-31 23:00 2013-02-01 00:53 C 1 0
93475 394 2013-02-01 00:54 2013-02-01 03:26 C 0 0
93476 394 2013-02-01 03:27 2013-02-01 05:39 C 0 0
93477 394 2013-02-01 05:44 2013-02-01 07:00 C 0 1
第二次运行显示错误更新的记录。 Login / LogoutDateTimes以及LoggedIn标志已更新。 我需要我的vb应用程序做的是设置每个员工的第一个LoginDateTime = Time&出勤时钟输入,并设置他们的最后一个LogoutDateTime = T& A时钟输出。包含的图像显示了我的应用程序的第一次和第二次运行,它在必要时设置了LoggedIn和LoggedOut字段。但是,此应用程序将在白天多次运行,并会在添加新记录时更新。问题:(是的,我知道......最后)应用程序的后续运行(参见“第二次运行后的表:”)获取不应更新的额外记录。例如,在应用程序的第二次运行时,将获取EmployeeWorkID = 93466的记录,并将LoginDateTime设置为T& A时钟(看起来像EmployeeWorkID = 93464),并且LoggedIn标志将设置为1我已经通过SQL查询和vb代码尝试了很多方法,但是没有解决方案。这是我在应用程序中进行的主要SQL调用,它可能看起来不漂亮,但它有效(至少运行一次)。
SELECT
ew2.EmployeeWorkID
, qryID.Empl
, qryID.LoggedIn
, qryID.LoginDateTime
, ew2.LogoutDateTime
, qryID.RoundedInPunchDate
, qryID.RoundedOutPunchDate
, qryID.ScheduledInDateTime
, qryID.ScheduledOutDateTime
FROM
(
SELECT
ew.EmployeeID
, stmE.Empl
, stmE.STM_Employee_id
, MIN(ew.LoginDateTime) AS LoginDateTime
, vIO.RoundedInPunchDate
, vIO.RoundedOutPunchDate
, vES.ScheduledInDateTime
, vES.ScheduledOutDateTime
, ew.LoggedIn
FROM
tblEmployeeWork AS ew INNER JOIN
tblEmployees AS e ON ew.EmployeeID = e.EmployeeID INNER JOIN
STROMBERG.StrombergTest.dbo.STM_Employee AS stmE ON e.Empl = stmE.Empl INNER JOIN
STROMBERG.StrombergTest.dbo.v_BI_Employee_InOutPunches_AutoLogout2 AS vIO ON
stmE.STM_Employee_id = vIO.STM_Employee_id
AND CONVERT(varchar, ew.LoginDateTime, 101) = CONVERT(varchar, vIO.RoundedInPunchDate,
101) INNER JOIN
STROMBERG.StrombergTest.dbo.v_BI_DailyEmplScheduleAndHoursWorked AS vES ON
vIO.STM_Employee_id = vES.STM_Employee_id AND
CONVERT(varchar, vIO.RoundedInPunchDate, 101) =
CONVERT(varchar,vES.ScheduledInDateTime, 101)
WHERE
(ew.LogoutDateTime BETWEEN '1/31/2013' AND DATEADD(d, 2, '1/31/2013')) AND
(vIO.RoundedInPunchDate BETWEEN '1/31/2013' AND DATEADD(d, 2, '1/31/2013')) AND
(ew.LoginDateTime BETWEEN '1/31/2013' AND DATEADD(d, 2, '1/31/2013'))
GROUP BY DAY(CONVERT(varchar, ISNULL(ew.LoginDateTime, vES.ScheduledInDateTime), 101)),
ew.EmployeeID, vIO.RoundedOutPunchDate, stmE.Empl, stmE.STM_Employee_id,
vIO.RoundedInPunchDate, vES.ScheduledInDateTime, vES.ScheduledOutDateTime, stmE.Empl,
ew.LoggedIn) AS qryID INNER JOIN
tblEmployeeWork AS ew2 ON qryID.EmployeeID = ew2.EmployeeID AND qryID.LoginDateTime =
ew2.LoginDateTime
ORDER BY ew2.EmployeeID
答案 0 :(得分:0)
我想我明白你要做什么了。您希望在LoggedIn字段中将当天的第一次签到设置为1,并在LoggedOut字段中将当天的最后一次签出设置为1.
此查询将为您提供当天的所有首次登记,以及每位员工和每天的最后一次结帐。
select EmplID, min(LoginDateTime), max(LogoutDateTime)
group by EmplID, year(LoginDateTime), month(LoginDateTime), day(LoginDateTime)
嗯,不完全是。只有在午夜没有员工办理登机手续时,它才有效。否则,退出时间将是从指定日期开始退出的时间。
因此,VB代码可用于将此结果中的所有值设置为1,将其他所有值设置为0。
对同一数据进行多次运行将设置与以前相同的值。如果添加了更多数据,结果将修复数据,只要代码将值设置回0。
可以通过添加where子句来处理性能,该子句仅更改过去N天的数据。在过去的7天里,
where LoginDateTime >= DATEADD(day, -7, GETDATE())