删除时间戳列不同的SQL Server中单个表中的行

阿吉

我有一张员工时钟打卡表,看起来像这样:

| EmployeeID | PunchDate  | PunchTime | PunchType | Sequence |
|------------|------------|-----------|-----------|----------|
|       5386 | 12/27/2016 | 03:57:42  | On Duty   |      552 |
|       5386 | 12/27/2016 | 09:30:00  | Off Duty  |      563 |
|       5386 | 12/27/2016 | 010:02:00 | On Duty   |      564 |
|       5386 | 12/27/2016 | 12:10:00  | Off Duty  |      570 |
|       5386 | 12/27/2016 | 12:22:00  | On Duty   |      571 |
|       5386 | 12/27/2016 | 05:13:32  | Off Duty  |      578 |  

我需要做的是删除任何值班时间随后的 值班时间之间的分钟差少于25分钟的行。在上面的示例中,我想删除序列570和571。

我已经通过拉动所有创建此表的关税从另一个表拳和使用此查询拉所有值班遵循的拳退出值班冲:

SELECT *  FROM [dbo].[Punches]
INSERT INTO [dbo].[UpdatePunches (EmployeeID,PunchDate,PunchTime,PunchType,Sequence)
SELECT *  FROM [dbo].[Punches]
WHERE Sequence IN (
SELECT Sequence + 1
FROM [dbo].[Punches]
WHERE PunchType LIKE 'Off Duty%') AND
PunchType LIKE 'On Duty%'   

我一直在尝试在此代码中以及作为清除这些错误的一个单独步骤来适合某种DATEDIFF查询,但是还没有任何运气。我不能使用特定的序列号,因为每次打孔时这些序列号都会改变。

我正在使用SQL Server 2008。

任何建议将不胜感激。

瓦姆西·普拉巴拉(Vamsi Prabhala)

您可以根据打孔日期和打孔时间为每个员工分配行号,并根据日期和时间的升序将每一行与下一行连接起来。

此后,获取相差少于25分钟的那些行的行号,最后删除这些行。

with rownums as 
(select t.*,row_number() over(partition by employeeid 
                              order by cast(punchdate +' '+punchtime as datetime) ) as rn
 from t)
,rownums_to_delete as 
(
 select r1.rn,r1.employeeid
 from rownums r1
 join rownums r2 on r1.employeeid=r2.employeeid and r1.rn=r2.rn+1
 where dateadd(minute,25,cast(r2.punchdate +' '+r2.punchtime as datetime)) > cast(r1.punchdate +' '+r1.punchtime as datetime)
 and r1.punchtype <> r2.punchtype
 union all
 select r2.rn, r2.employeeid
 from rownums r1
 join rownums r2 on r1.employeeid=r2.employeeid and r1.rn=r2.rn+1
 where dateadd(minute,25,cast(r2.punchdate +' '+r2.punchtime as datetime)) > cast(r1.punchdate +' '+r1.punchtime as datetime)
 and r1.punchtype <> r2.punchtype
)
delete r
from rownums_to_delete rd
join rownums r on rd.employeeid=r.employeeid and r.rn=rd.rn

Sample Demo

如果日期和时间列不是varchar实际datetime数据类型,请punchdate+punchtime在查询中使用

编辑:更简单的查询版本将是

with todelete as (
select t1.employeeid,cast(t2.punchdate+' '+t2.punchtime as datetime) as punchtime,
t2.punchtype,t2.sequence,
cast(t1.punchdate+' '+t1.punchtime as datetime) next_punchtime, 
t1.punchtype as next_punchtype,t1.sequence as next_sequence
from t t1
join t t2 on t1.employeeid=t2.employeeid 
and cast(t2.punchdate+' '+t2.punchtime as datetime) between dateadd(minute,-25,cast(t1.punchdate+' '+t1.punchtime as datetime)) and cast(t1.punchdate+' '+t1.punchtime as datetime) 
where t2.punchtype <> t1.punchtype
    )
delete t
from t 
join todelete td on t.employeeid = td.employeeid 
and cast(t.punchdate+' '+t.punchtime as datetime) in (td.punchtime,td.next_punchtime)
;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

单个查询中的SQL Server表组合

来自分类Dev

从特定列的时间戳中删除毫秒

来自分类Dev

在SQL Server中获取重叠时间戳的不同行

来自分类Dev

根据时间戳和单独列中的文本删除行

来自分类Dev

连接表中特定列的 SQL Server 每天最大时间戳

来自分类Dev

通过Month SQL计算时间戳中的不同日期

来自分类Dev

从SQL Server中的单个行获取最大ID行

来自分类Dev

使用单个查询从2个表中删除行

来自分类Dev

使用Flask从HTML表中删除单个SQLAlchemy行

来自分类Dev

熊猫在重新采样中删除时间戳列

来自分类Dev

熊猫在重新采样中删除时间戳列

来自分类Dev

SQL在时间戳上联接两个不同的表

来自分类Dev

SQL Server在单个表中添加两个时间列,并将结果放入第三列

来自分类Dev

如何计算一张表中不同行和列之间的时间戳差异?

来自分类Dev

SQL:将UTC时间戳列从日期和时间添加到表中

来自分类Dev

如何计算SQL Server中每列(在单个表中)的数据长度?

来自分类Dev

SQL Server中的时间戳混乱

来自分类Dev

SQL Server中的当前时间戳

来自分类Dev

记录在表SQL Server中删除的行

来自分类Dev

SQL Server 2012:来自不同表的单个查询中的多个选择计数(第1列)导致错误

来自分类Dev

如何在Oracle SQL中获取日期列的时间戳?

来自分类Dev

从SQL Server中单个表的数据比较两个不同时期

来自分类Dev

如何仅从满足单个列的特定“组”条件的 SQLite 表中返回不同的行?

来自分类Dev

从CodeIgniter中的不同表中删除行

来自分类Dev

SQL Server:在表1中而不在表2中查找行,但是需要表中的数据

来自分类Dev

SQL Server 从表中获取行并按列显示

来自分类Dev

如何在PostgreSQL中的单个SQL中在父表中插入一行,然后在子表中插入多个行?

来自分类Dev

如何在PostgreSQL中的单个SQL中在父表中插入一行,然后在子表中插入多个行?

来自分类Dev

如何从SQL Server中的表中获取行的索引?

Related 相关文章

  1. 1

    单个查询中的SQL Server表组合

  2. 2

    从特定列的时间戳中删除毫秒

  3. 3

    在SQL Server中获取重叠时间戳的不同行

  4. 4

    根据时间戳和单独列中的文本删除行

  5. 5

    连接表中特定列的 SQL Server 每天最大时间戳

  6. 6

    通过Month SQL计算时间戳中的不同日期

  7. 7

    从SQL Server中的单个行获取最大ID行

  8. 8

    使用单个查询从2个表中删除行

  9. 9

    使用Flask从HTML表中删除单个SQLAlchemy行

  10. 10

    熊猫在重新采样中删除时间戳列

  11. 11

    熊猫在重新采样中删除时间戳列

  12. 12

    SQL在时间戳上联接两个不同的表

  13. 13

    SQL Server在单个表中添加两个时间列,并将结果放入第三列

  14. 14

    如何计算一张表中不同行和列之间的时间戳差异?

  15. 15

    SQL:将UTC时间戳列从日期和时间添加到表中

  16. 16

    如何计算SQL Server中每列(在单个表中)的数据长度?

  17. 17

    SQL Server中的时间戳混乱

  18. 18

    SQL Server中的当前时间戳

  19. 19

    记录在表SQL Server中删除的行

  20. 20

    SQL Server 2012:来自不同表的单个查询中的多个选择计数(第1列)导致错误

  21. 21

    如何在Oracle SQL中获取日期列的时间戳?

  22. 22

    从SQL Server中单个表的数据比较两个不同时期

  23. 23

    如何仅从满足单个列的特定“组”条件的 SQLite 表中返回不同的行?

  24. 24

    从CodeIgniter中的不同表中删除行

  25. 25

    SQL Server:在表1中而不在表2中查找行,但是需要表中的数据

  26. 26

    SQL Server 从表中获取行并按列显示

  27. 27

    如何在PostgreSQL中的单个SQL中在父表中插入一行,然后在子表中插入多个行?

  28. 28

    如何在PostgreSQL中的单个SQL中在父表中插入一行,然后在子表中插入多个行?

  29. 29

    如何从SQL Server中的表中获取行的索引?

热门标签

归档