时间统计

borwin 2008-03-13 09:01:29
create table #tmp(empid int ,AttnDate Datetime, Fstyle Int)

insert into #tmp
select 1,'2008-01-02 09:00:01',0
union all
select 1,'2008-01-02 12:00:02',1
union all
select 1,'2008-01-02 14:00:00',0
union all
select 1,'2008-01-02 17:35:00',1
union all
select 2,'2008-01-02 09:00:00',0
union all
select 2,'2008-01-02 12:00:00',1
union all
select 2,'2008-01-02 14:00:00',0
union all
select 2,'2008-01-02 17:35:00',1
union all
select 3,'2008-01-02 09:00:00',0
union all
select 3,'2008-01-02 12:00:00',1
union all
select 3,'2008-01-02 14:00:00',0

得出结果如下:

EMP 上班时间 下班时间 上班时间 下班时间 上班总时间
1,'2008-01-02 09:00:00','2008-01-02 12:00:00','2008-01-02 14:00:00','2008-01-02 17:35:01' ,7.5
2,'2008-01-02 09:00:00','2008-01-02 12:00:00','2008-01-02 14:00:00','2008-01-02 17:35:01' ,7.5
2,'2008-01-02 09:00:00','2008-01-02 12:00:00','2008-01-02 14:00:00', null ,3
...全文
219 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
star1083 2008-03-15
  • 打赏
  • 举报
回复
用得到这个。呵呵
昵称被占用了 2008-03-14
  • 打赏
  • 举报
回复
不测试就有错

create table #tmp(empid int ,AttnDate Datetime, Fstyle Int)  

insert into #tmp
select 1,'2008-01-02 09:00:01',0
union all
select 1,'2008-01-02 09:00:15',0
union all
select 1,'2008-01-02 09:00:30',0
union all
select 1,'2008-01-02 12:00:02',1
union all
select 1,'2008-01-02 14:00:00',0
union all
select 1,'2008-01-02 17:35:00',1

delete t
from #tmp t
where exists (
select 1 from #tmp
where empid=t.empid and Fstyle=t.Fstyle
and AttnDate<t.AttnDate
and datediff(mi,AttnDate,t.AttnDate)<5
)

select * from #tmp

--结果
empid AttnDate Fstyle
----------- ------------------------------------------------------ -----------
1 2008-01-02 09:00:01.000 0
1 2008-01-02 12:00:02.000 1
1 2008-01-02 14:00:00.000 0
1 2008-01-02 17:35:00.000 1

(所影响的行数为 4 行)
昵称被占用了 2008-03-14
  • 打赏
  • 举报
回复
delete t
from #tmp t
where exists (
select 1 from #tmp
where empid=a.empid and Fstyle=a.Fstyle
and AttnDate<a.AttnDate
and datediff(mi,AttnDate,a.AttnDate)<5
)
borwin 2008-03-14
  • 打赏
  • 举报
回复
create table #tmp(empid int ,AttnDate Datetime, Fstyle Int)

insert into #tmp
select 1,'2008-01-02 09:00:01',0
union all
select 1,'2008-01-02 09:00:15',0
union all
select 1,'2008-01-02 09:00:30',0
union all
select 1,'2008-01-02 12:00:02',1
union all
select 1,'2008-01-02 14:00:00',0
union all
select 1,'2008-01-02 17:35:00',1

怎样用一条sql语句,将间隔少于5分钟的记录删除,就是将union all
select 1,'2008-01-02 09:00:15',0
union all
select 1,'2008-01-02 09:00:30',0 这两条数据删除了。
borwin 2008-03-13
  • 打赏
  • 举报
回复
如果有个表设置了上早的时间段为 09:00:00 到 12:00:00 ,下午段为14:00:00 到 17:00:00,怎样知道有没有早到,迟到,谢谢、。
dawugui 2008-03-13
  • 打赏
  • 举报
回复
多余四次的,自己考虑那些数据有效,那些数据无效,把每个人每天整合成四条数据.

这个就不是容易的事情了,详见我上面贴的地址,自己看看.
borwin 2008-03-13
  • 打赏
  • 举报
回复
谢谢,还有个问题,如果打卡次数多余四次
create table #tmp(empid int ,AttnDate Datetime, Fstyle Int)

insert into #tmp
select 1,'2008-01-02 09:00:01',0
union all
select 1,'2008-01-02 12:00:02',1
union all
select 1,'2008-01-02 14:00:00',0
union all
select 1,'2008-01-02 17:35:00',1
union all
select 1,'2008-01-02 19:35:00',0
union all
select 1,'2008-01-02 21:35:00',1
如下,有怎样处理,重点是算出总时间
-狙击手- 2008-03-13
  • 打赏
  • 举报
回复
死龟
dawugui 2008-03-13
  • 打赏
  • 举报
回复
多谢
bqb 2008-03-13
  • 打赏
  • 举报
回复
转:潇洒老乌龟(爱新觉罗.毓华) 

建议:
比如:
早上上班,在8:00前后一个小时内打卡的有效,其他时间无效.(如果没打卡,算缺勤,9:00以后打卡无效,其他类似)
中午下班,在12:00前后一个小时内打卡的有效,其他时间无效.
下午上班,在13:30前后一个小时内打卡的有效,其他时间无效.
.....

这样就应该行了.

我接触过一些港资企业就是这么干的.

如:7:30-8:05(可以迟到5分钟)打上午的上班卡,其他时间无效,没打的算缺勤.
其他类似.


严重支持潇洒老乌龟
-狙击手- 2008-03-13
  • 打赏
  • 举报
回复
dawugui 2008-03-13
  • 打赏
  • 举报
回复
我把那个帖给你看看.

http://topic.csdn.net/u/20080310/09/edbcc51b-ae14-453f-aa47-7d3658eba1e1.html?1516005376

bqb 2008-03-13
  • 打赏
  • 举报
回复
计算出勤小时 要根据班次时间 和 打卡时间 来判断!
至于哪个是上班,哪个是下班? 看打卡在哪个时间范围内,如果出现短时间内有多笔数据如(08:59, 09:00)
等可以这样做.在上班卡时间范围内,取最早的一笔,在下班卡时间范围内取最晚一笔

如果条件允许的话,可以采用不同考勤机作为上班,下班打卡,根据机号来判断哪笔是上班卡,哪笔是下班卡!
dawugui 2008-03-13
  • 打赏
  • 举报
回复
bqb
----------------------------
个人觉得你考虑复杂了,如果要按你这么算,就那天那个帖,你连哪个是上班,哪个是下班都没法知道.
areswang 2008-03-13
  • 打赏
  • 举报
回复
LS说的在理
bqb 2008-03-13
  • 打赏
  • 举报
回复
更正:


存在如下问题:
empid 1 多打了一次上班卡 08:59 上班时间由原本6.5小时,变成 2小时
empid 2 漏打了中间两次12:00,14:00 上班时间由原本6.5小时, 变成 8.5小时

楼主有考虑过这些问题吗?员工不可能都规规矩矩 按照你的模式去打卡,计算上班不能这么算?
bqb 2008-03-13
  • 打赏
  • 举报
回复
个人觉得这样算有点问题!如下:



create table tb(empid int ,AttnDate Datetime, Fstyle Int) 

insert into tb
select 1,'2008-01-02 08:59:01',0 ---上班卡多打了一次
union all
select 1,'2008-01-02 09:00:01',0
union all
select 1,'2008-01-02 12:00:02',1
union all
select 1,'2008-01-02 14:00:00',0
union all
select 1,'2008-01-02 17:35:00',1
union all
select 2,'2008-01-02 09:00:00',0
/*
union all
select 2,'2008-01-02 12:00:00',1 ---打卡少打了中间两次
union all
select 2,'2008-01-02 14:00:00',0
*/
union all
select 2,'2008-01-02 17:35:00',1
union all
select 3,'2008-01-02 09:00:00',0
union all
select 3,'2008-01-02 12:00:00',1
union all
select 3,'2008-01-02 14:00:00',0


select empid , 上班时间1 上班时间 , 下班时间1 下班时间 , 上班时间2 上班时间1 , 下班时间2 下班时间1,
cast((case when 下班时间1 is null then 0 else datediff(mi , 上班时间1 , 下班时间1) end + case when 下班时间2 is null then 0 else datediff(mi , 上班时间2 , 下班时间2) end)/30*1.0/2 as decimal(18,1)) 上班总时间 from
(
select empid ,
max(case px when 1 then attndate end) 上班时间1,
max(case px when 2 then attndate end) 下班时间1,
max(case px when 3 then attndate end) 上班时间2,
max(case px when 4 then attndate end) 下班时间2
from
(
select * , px = (select count(1) from tb where empid = t.empid and convert(varchar(10),attndate,120) = convert(varchar(10),t.attndate,120) and attndate < t.attndate) + 1 from tb t
) m
group by empid , convert(varchar(10),attndate,120)
) n

drop table tb


/*
empid 上班时间 下班时间 上班时间1 下班时间1 上班总时间
----------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ --------------------
1 2008-01-02 08:59:01.000 2008-01-02 09:00:01.000 2008-01-02 12:00:02.000 2008-01-02 14:00:00.000 2.0
2 2008-01-02 09:00:00.000 2008-01-02 17:35:00.000 NULL NULL 8.5
3 2008-01-02 09:00:00.000 2008-01-02 12:00:00.000 2008-01-02 14:00:00.000 NULL 3.0
*/



存在如下问题:
empid 1 多打了一次上班卡 08:59 上班时间由原本6.5小时,变成 2小时
empid 3 漏打了中间两次12:00,14:00 上班时间由原本2小时, 变成 8.5小时

楼主有考虑过这些问题吗?员工不可能都规规矩矩 按照你的模式去打卡,计算上班不能这么算?


dawugui 2008-03-13
  • 打赏
  • 举报
回复
结果没对齐,是CSDN排版的问题.
dawugui 2008-03-13
  • 打赏
  • 举报
回复

--搞定.
create table tb(empid int ,AttnDate Datetime, Fstyle Int)

insert into tb
select 1,'2008-01-02 09:00:01',0
union all
select 1,'2008-01-02 12:00:02',1
union all
select 1,'2008-01-02 14:00:00',0
union all
select 1,'2008-01-02 17:35:00',1
union all
select 2,'2008-01-02 09:00:00',0
union all
select 2,'2008-01-02 12:00:00',1
union all
select 2,'2008-01-02 14:00:00',0
union all
select 2,'2008-01-02 17:35:00',1
union all
select 3,'2008-01-02 09:00:00',0
union all
select 3,'2008-01-02 12:00:00',1
union all
select 3,'2008-01-02 14:00:00',0


select empid , 上班时间1 上班时间 , 下班时间1 下班时间 , 上班时间2 上班时间 , 下班时间2 下班时间,
cast((case when 下班时间1 is null then 0 else datediff(mi , 上班时间1 , 下班时间1) end + case when 下班时间2 is null then 0 else datediff(mi , 上班时间2 , 下班时间2) end)/30*1.0/2 as decimal(18,1)) 上班总时间 from
(
select empid ,
max(case px when 1 then attndate end) 上班时间1,
max(case px when 2 then attndate end) 下班时间1,
max(case px when 3 then attndate end) 上班时间2,
max(case px when 4 then attndate end) 下班时间2
from
(
select * , px = (select count(1) from tb where empid = t.empid and convert(varchar(10),attndate,120) = convert(varchar(10),t.attndate,120) and attndate < t.attndate) + 1 from tb t
) m
group by empid , convert(varchar(10),attndate,120)
) n

drop table tb

/*
empid 上班时间 下班时间 上班时间 下班时间 上班总时间
----- ----------------------- ----------------------- ----------------------------------------------- ----------
1 2008-01-02 09:00:01.000 2008-01-02 12:00:02.000 2008-01-02 14:00:00.000 2008-01-02 17:35:00.000 6.5
2 2008-01-02 09:00:00.000 2008-01-02 12:00:00.000 2008-01-02 14:00:00.000 2008-01-02 17:35:00.000 6.5
3 2008-01-02 09:00:00.000 2008-01-02 12:00:00.000 2008-01-02 14:00:00.000 NULL 3.0

(所影响的行数为 3 行)
*/
dawugui 2008-03-13
  • 打赏
  • 举报
回复
create table tb(empid int ,AttnDate Datetime, Fstyle Int) 

insert into tb
select 1,'2008-01-02 09:00:01',0
union all
select 1,'2008-01-02 12:00:02',1
union all
select 1,'2008-01-02 14:00:00',0
union all
select 1,'2008-01-02 17:35:00',1
union all
select 2,'2008-01-02 09:00:00',0
union all
select 2,'2008-01-02 12:00:00',1
union all
select 2,'2008-01-02 14:00:00',0
union all
select 2,'2008-01-02 17:35:00',1
union all
select 3,'2008-01-02 09:00:00',0
union all
select 3,'2008-01-02 12:00:00',1
union all
select 3,'2008-01-02 14:00:00',0


select empid , 上班时间1 上班时间 , 下班时间1 下班时间 , 上班时间2 上班时间1 , 下班时间2 下班时间1,
cast((case when 下班时间1 is null then 0 else datediff(mi , 上班时间1 , 下班时间1) end + case when 下班时间2 is null then 0 else datediff(mi , 上班时间2 , 下班时间2) end)/30*1.0/2 as decimal(18,1)) 上班总时间 from
(
select empid ,
max(case px when 1 then attndate end) 上班时间1,
max(case px when 2 then attndate end) 下班时间1,
max(case px when 3 then attndate end) 上班时间2,
max(case px when 4 then attndate end) 下班时间2
from
(
select * , px = (select count(1) from tb where empid = t.empid and convert(varchar(10),attndate,120) = convert(varchar(10),t.attndate,120) and attndate < t.attndate) + 1 from tb t
) m
group by empid , convert(varchar(10),attndate,120)
) n

drop table tb

/*
empid 上班时间 下班时间 上班时间1 下班时间1 上班总时间
----------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ --------------------
1 2008-01-02 09:00:01.000 2008-01-02 12:00:02.000 2008-01-02 14:00:00.000 2008-01-02 17:35:00.000 6.5
2 2008-01-02 09:00:00.000 2008-01-02 12:00:00.000 2008-01-02 14:00:00.000 2008-01-02 17:35:00.000 6.5
3 2008-01-02 09:00:00.000 2008-01-02 12:00:00.000 2008-01-02 14:00:00.000 NULL 3.0

(所影响的行数为 3 行)
*/
加载更多回复(8)
演示下载: http://demo.codechina.net/vf/tsjxc.exe 总部主系统 1 功能 1.1 进货管理 1.1.1 进货单查询、录入、修改、删除、恢复。并将进货数据传至库存模块,经库存审核后自动录入库存库。 1.1.2 缺货清单查询。 1.1.3 退货(退厂)数据查询、打印。根据库存库退货出库所传来的数据自动录入。 1.1.4 统计进货数据,查看和打印统计结果。统计的项目为: 1.1.4.1 任意时段所有商品的进货、退货、保修金额合计。 1.1.4.2 任意时段某一商品的进货、退货、保修数量、金额合计。 1.1.4.3 到目前为止尚未保修返回的金额合计。 1.1.4.4 任意时段所有供应商的进货、退货、保修金额合计。 1.1.4.5 任意时段某一供应商的进货、退货、保修金额合计。 1.1.5 供应商查询、录入、修改、删除、恢复。 1.1.6 保修(保修退厂)数据查询、打印、返回核消。根据库存库保修出库所传来的数据自动审核录入。 1.2 库存管理 1.2.1 初始化库存,录入商品的初始库存数,一旦总帐中已有该商品,则不能再录入初始数。 1.2.2 进、出库数据查询、录入、修改、删除、恢复。审核及自动录入进货模块和代销模块由于进货、出货、退货及保修传来的进出库数据。打印进出库单。 1.2.3 设定商品库存下限。在库存低于下限时报警,并出具下限报警商品清单给进货模块。 1.2.4 盘点。查看、打印盘点表。录入盘盈、盘亏数据。盘亏的数据做为报费数进行统计。残次品库的盘点,盘盈、盘亏数直接在残次品库中处理。 1.2.5 (暂不使用)残次品、报费数据的输入。正品转残次品,从仓库总帐及日记帐中做出库处理,自动转到残次品库;残次品转正品,则自动从残次品库中出库转向总库,总帐及日记帐中做入库处理。 1.2.6 库存数据统计,查看、打印统计数据。统计的项目为: 1.2.6.1 统计到目前为止所有商品的数量、金额合计。 1.2.6.2 任意时段所有商品的进库、出库数量、金额合计。 1.2.6.3 任意时段某一商品的进库、出库数量、金额合计。 1.2.6.4 到目前为止残次品的库存金额合计。 1.2.6.5 任意时段所有商品的报费金额合计。 1.2.6.6 任意时段某一商品的报费数量、金额合计。 1.3 销售管理 1.3.1 记录每一笔销售数据。录入、修改、删除、恢复、查看每一笔从总部的仓库中直接销售出去的数据。并将销售数据自动传送到库存模块用于审核及自动录入。 1.3.2 退货管理。录入、修改、删除、恢复、查看有关退货的数据,并将退货数据自动传给库存模块,由库存审核后自动录入。 1.3.3 保修管理。录入、修改、删除、恢复、查看有关保修的数据,返回核消,并将保修数据自动传给库存模块,由库存审核后自动录入。 1.3.4 统计销售数据,并查看和打印统计数据,按金额排序,标记出数量最多的商品。统计的项目为: 1.3.4.1 任意时段所有商品的销售金额、合计。 1.3.4.2 任意时段某一商品的销售数量、金额合计。 1.4 代销管理 1.4.1 出货单管理。记录每一笔出货给代销商的数据。并将数据传给库存模块,经审核后自动录入。 1.4.2 结算管理。根据出货单中的金额数据记录应付款,代销商每付一笔款,即从结算款中减去相应的数额,余额继续做为应付款。 1.4.3 销售管理。录入、修改、删除、恢复代销商传来的有关销售数据,传送的方式可用纸质、磁盘、电话线。根据销售数计算并自动录入代销点的库存数。 1.4.4 退货(退仓)数据录入、修改、删除、恢复、查看。并将退货数据传给库存模块,由库存审核后自动录入。 1.4.5 保修(保修退仓)数据录入、修改、删除、恢复、查看。并将保修数据传给库存模块,由库存审核后自动录入。 1.4.6 销售统计,并查看和打印统计数据。统计的范围包括某一代销商、全部代销商、包括仓库直接销售,统计的项目为: 1.4.6.1 任意时段所有商品的销售金额、成本、利润合计。 1.4.6.2 任意时段某一商品的销售数量、金额、成本、利润合计。 1.4.6.3 任意时段销售数量、营业额、成本、利润最多、最少的商品。 1.4.6.4 到目前为止,盘点的库存数与上报销售数所推算出的库存数的差额,分别包括数量和金额。 1.4.6.5 任意时段退货金额。 1.4.6.6 任意时段保修金额,及到目前为止尚未保修返还的商品、数量、金额。 1.4.6.7 到目前为止的各代销商及总的应收款金额合计。 1.4.7 盘点。查看、打印盘点表。录入盘点库存数,但不用盘点数修正根据销售数所得的库存数,两个数据都要,并在统计中做比较,以了解代销商押总部货款的数额。 1.5 辅助功能 1.5.1 工作人员管理。 1.5.2 备份。 1.5.3 取备份。 1.5.4 密码管理。 1.5.5 整理数据。将所有数据库重新索引,稽核相关数据。 1.5.6 退出系统。 1.5.7 确认系统日期和时间。 ................... 内容详细文档

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧