求助判断的SQL语句

zz005 2008-11-14 06:05:37

'问题:考勤表出现了没有打卡的人员,那么如何用SQL语句来判断没有打卡的人员呢?(如何得到没有打卡的人员和日期).
'

'各自为两个数据表:

'一个表是: "员工表" 字段: "编号" "姓名"

'001 小麦
'002 小王

'另一个表是: "考勤表" 字段: "卡号" "日期" "打卡时间"

'001 01 08:28
'001 01 12:01
'001 01 13:01
'001 01 18:00

'002 01 08:28
'002 01 12:01
'002 01 13:01
'002 01 18:00


'001 02 08:28
'001 02 12:01
'001 02 13:01
'001 02 18:00 '说明:编号为002的在02日没有打卡




...全文
209 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2008-11-22
  • 打赏
  • 举报
回复


我做过考勤机软件。

实际应用中的考勤记录检索要比这复杂得多。

1 每个员工必须要有班次表,说明某种班次的适用期限,说明上班时间和下班时间,分几段。
2 要有加班表说明临时加班的情况。
3 要有请假表,说明请假的日期,时间和事由。
4 要有节假日表,说明节假日的调整情况。
5 如果是工业企业,还要有换休表。
6 ...

对一个员工做当月考勤,首先要逐日循环,如果是他的工作日,或有加班,则搜索他在当天的打卡记录。

如果没有记录,查请假表。如果是请假,汇总到请假中;否则按缺勤记录。

如果有记录,对得到的每一个记录都要与上下班时间和加班时间比对,得出正常上班、迟到、早退和正常下班等结论。并计算工时。

其中还有跨午夜的问题,也要根据考勤制度来处理。

所以,实际上是逐人、逐日、逐记录分析的过程。在这个过程中,可以用 SQL 查询来加快进程,但不可能用几个查询来解决考勤统计的所有规则解释。

zz005 2008-11-22
  • 打赏
  • 举报
回复
谢谢小哥提醒.
jhone99 2008-11-16
  • 打赏
  • 举报
回复
结果

编号 姓名 日期
002 小王 02
zz005 2008-11-16
  • 打赏
  • 举报
回复
谢谢 jhone99 兄台
zz005 2008-11-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 uself 的回复:]
得到本月有考勤的日期:
select distinct 日期 from 考勤表

得到本月某员工有考勤日期:
select distinct 日期 from 考勤表 where 卡号=某卡号

查询本月某员工没有考勤的日期:
select distinct 日期 from 考勤表
union
select distinct 日期 from 考勤表 where 卡号=某卡号

[/Quote]

还不能解决问题
jhone99 2008-11-16
  • 打赏
  • 举报
回复

select e.编号,f.姓名,e.日期
from (select 编号,日期
from (select a.编号,b.日期
from (select 编号 from 员工表) a
,(select 日期 from 考勤表 group by 日期) b
)
where 编号 & 日期 not in (select 编号 & 日期 from 考勤表 group by 编号, 日期)
) e
,员工表 f
where e.编号 = f.编号
zz005 2008-11-16
  • 打赏
  • 举报
回复
谢谢杨哥
杨哥儿 2008-11-16
  • 打赏
  • 举报
回复
得到本月有考勤的日期:
select distinct 日期 from 考勤表

得到本月某员工有考勤日期:
select distinct 日期 from 考勤表 where 卡号=某卡号

查询本月某员工没有考勤的日期:
select distinct 日期 from 考勤表
union
select distinct 日期 from 考勤表 where 卡号=某卡号
杨哥儿 2008-11-15
  • 打赏
  • 举报
回复
第一步:查找当天打卡次数少于必需次数的人员,
如上午9:00为1,中午12:30为2;下午13:30为3,18:30为4.
select 卡号 from 考勤表 where 日期='01' group by 卡号,日期 having count(时间)<规定次数
第二步:再查询哪个时间没打卡
zz005 2008-11-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xrongzhen 的回复:]
问题说的还是不太清楚,上下班必须都打卡?一天要打四次卡,你要的没打卡的日期是哪种?还是只要不够四次的就检索出来?


[/Quote]


好像这位兄台没有看清楚问题哦 答非所问


xrongzhen 2008-11-15
  • 打赏
  • 举报
回复
问题说的还是不太清楚,上下班必须都打卡?一天要打四次卡,你要的没打卡的日期是哪种?还是只要不够四次的就检索出来?

zz005 2008-11-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 uself 的回复:]
查询没有打卡的人员:

select 编号,姓名 from 员工表 where 编号 not in(select distinct 卡号 from 考勤表 where 日期=查询日期)

[/Quote]

where 日期=查询日期 这样不是每次要来给个日期来判断.

如果能 where 月份=查询月份 就能OK了.让判断查询的月份中没有打卡的人员.


tongnaifu 2008-11-15
  • 打赏
  • 举报
回复
如果考勤表里的数据是严格按照每人每天4个卡,可以"select 卡号,日期,count(打卡时间) as 打卡次数 from 考勤表 group by 卡号,日期",这样判断打卡次数就可以了,不过如果不是严格按照每人每天4个卡就会出错,例如下午上班卡打三次,下班卡不打也不会查出有问题,所以还是麻烦点用上面的方法。
杨哥儿 2008-11-15
  • 打赏
  • 举报
回复
查询没有打卡的人员:

select 编号,姓名 from 员工表 where 编号 not in(select distinct 卡号 from 考勤表 where 日期=查询日期)
zz005 2008-11-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 uself 的回复:]
第一步:查找当天打卡次数少于必需次数的人员,
如上午9:00为1,中午12:30为2;下午13:30为3,18:30为4.
select 卡号 from 考勤表 where 日期='01' group by 卡号,日期 having count(时间) <规定次数
第二步:再查询哪个时间没打卡

[/Quote]

问题只是需要判断那个人员没有打卡(就是在某天一个次卡都没有打,而不是缺少打卡.)
zz005 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tongnaifu 的回复:]
其它的方法判断不准的,比如我02日只打了三个卡怎么算?你也算满勤?
[/Quote]

主要是能分析判断出没有打卡的人员就OK了.
tongnaifu 2008-11-14
  • 打赏
  • 举报
回复
看起来麻烦,实际写挺简单的,用不了多少代码,又不能写存储过程,你就只好这样来代替存储过程了。其它的方法个人认为比较困难。
tongnaifu 2008-11-14
  • 打赏
  • 举报
回复
其它的方法判断不准的,比如我02日只打了三个卡怎么算?你也算满勤?
zz005 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tongnaifu 的回复:]
如果是Access,你要先说明白嘛,有个思路:
建一个表做为专门判断的表,使用前后都清空数据,表的列是011,012,013,014,021,022,023,024,031,032,033,034。。。,30天就是30*4=120列
分别代表01日的四个卡,02日的四个卡,03日的四个卡。。。。。(Access不能写存储过程就是麻烦)
然后从你的第二个表中读取一行,判断卡号如果不存在就新增一行,然后把打卡时间写入相应的列,如果卡号存在就更新打卡时间到相应的列,…
[/Quote]


哥们,这样的话难读好大,执行起来也挺复杂的.
tongnaifu 2008-11-14
  • 打赏
  • 举报
回复
如果是Access,你要先说明白嘛,有个思路:
建一个表做为专门判断的表,使用前后都清空数据,表的列是011,012,013,014,021,022,023,024,031,032,033,034。。。,30天就是30*4=120列
分别代表01日的四个卡,02日的四个卡,03日的四个卡。。。。。(Access不能写存储过程就是麻烦)
然后从你的第二个表中读取一行,判断卡号如果不存在就新增一行,然后把打卡时间写入相应的列,如果卡号存在就更新打卡时间到相应的列,当然对打卡时间要做一个判断以便写入相应的列,这样全部写一遍之后就可以根据Null值来判断哪个人哪天(甚至是哪个打卡时间)没有打卡。
加载更多回复(2)
 针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识入手,深入研究相关技术,并结合性能调整及丰富的诊断案例,力图将Oracle知识全面、系统、深入地展现给读者。   本书给出了大量取自实际工作现场的实例,在分析实例的过程中,兼顾深度与广度,不仅对实际问题的现象、产生原因和相关的原理进行了深入浅出的讲解,更主要的是,结合实际应用环境,提供了一系列解决问题的思路和方法,包括详细的操作步骤,具有很强的实战性和可操作性,适用于具备一定数据库基础、打算深入学习Oracle技术的数据库从业人员,尤其适用于入门、进阶以及希望深入研究Oracle技术的数据库管理人员。 第1章 数据库的启动和关闭 1 1.1 数据库的启动 1 1.1.1 启动数据库到NOMOUNT状态的过程 2 1.1.2 启动数据库到MOUNT状态 18 1.1.3 启动数据库OPEN阶段 26 1.2 数据库的访问 37 1.2.1 客户端的TNSNAMES.ORA文件配置 37 1.2.2 服务器端的监听器文件listener.ora配置 39 1.2.3 通过不同服务器名对数据库的访问 41 1.2.4 动态监听器注册服务 42 1.3 数据库的关闭 46 1.3.1 数据库关闭的步骤 46 1.3.2 几种关闭方式的对比 48 第2章 控制文件与数据库初始化 51 2.1 控制文件的内容 51 2.2 SCN 53 2.2.1 SCN的定义 53 2.2.2 SCN的获取方式 53 2.2.3 SCN的进一步说明 54 2.3 检查点(Checkpoint) 57 2.3.1 检查点(Checkpoint)的工作原理 57 2.3.2 常规检查点与增量检查点 59 2.3.3 LOG_CHECKPOINT_TO_ALERT参数 63 2.3.4 控制文件与数据文件头信息 64 2.3.5 数据库的启动验证 66 2.3.6 使用备份的控制文件 70 2.3.7 FAST_START_MTTR_TARGET 71 2.3.8 关于检查点执行的案例 74 2.3.9 Oracle 10g自动检查点调整 75 2.3.10 检查点信息及恢复起点 78 2.3.11 正常关闭数据库的状况 78 2.3.12 数据库异常关闭的情况 80 2.3.13 数据库并行恢复案例一则 82 2.3.14 判断一个死事务的恢复进度 85 2.4 数据库的初始化 86 2.4.1 bootstrap$及数据库初始化过程 86 2.4.2 bootstrap$的定位 88 2.4.3 Oracle中独一无二的Cache对象 89 2.4.4 Oracle数据库的引导 91 2.4.5 系统对象与bootstrap$ 92 2.4.6 bootstrap$的重要性 94 2.4.7 BBED工具的简要介绍 95 2.4.8 坏块的处理与恢复 97 第3章 参数及参数文件 103 3.1 初始化参数的分类 103 3.1.1 推导参数(Derived Parameters) 103 3.1.2 操作系统依赖参数 104 3.1.3 可变参数 104 3.1.4 初始化参数的获取 105 3.2 参数文件 107 3.2.1 PFILE和SPFILE 108 3.2.2 获取参数的视图 110 3.2.3 SPFILE的创建 111 3.2.4 SPFILE的搜索顺序 112 3.2.5 使用PFILE/SPFILE启动数据库 112 3.2.6 修改参数 113 3.2.7 解决SPFILE参数修改错误 118 3.2.8 重置SPFILE中设置的参数 120 3.2.9 判断是否使用了SPFILE 120 3.2.10 SPFILE的备份与恢复 121 3.2.11 Oracle 11g参数文件恢复 127 3.2.12 如何设置Events事件 128 3.2.13 导出SPFILE文件 129 3.3 诊断案例之一:参数文件 131 3.3.1 登录系统检查告警日志文件 131 3.3.2 尝试重新启动数据库 132 3.3.3 检查数据文件 132 3.3.4 MOUNT数据库,检查系统参数 133 3.3.5 检查参数文件 133 3.3.6 再次检查alert文件 134 3.3.7 修正PFILE 135 3.3.8 启动数据库 135 3.4 诊断案例之二:RAC环境参数文件 135 3.4.1 数据库资源异常 135 3.4.2 问题的发现 136 3.4.3 参数文件问题的解决 137 第4
vf6.0,要考二级没系统的下哈 Microsoft Visual FoxPro 6.0 for Windows 的常见问题 这些是有关 Microsoft Visual FoxPro 最常见的问题。在您求助 Microsoft 产品支持服务之前,请先查阅这张列表。 若想打印这些附注,请从“文件”菜单中选择“打印”命令。此文档分为以下四部分: --------------------------------------------------------------------- 部分 1. 技术支持与市场 部分 2. Visual FoxPro 6.0 新增功能 部分 3. 从其他版本的 FoxPro 和 Visual FoxPro 中移植 部分 4. Visual FoxPro 常见问题 --------------------------------------------------------------------- 部分 1. 技术支持与市场 问题 1-1: 从何处可以获得产品的更新版本? 答案: 在 Visual FoxPro 的 Web 站点上即可获得产品的更新信息,其中包括有关 Service Pack 和更新的示例、向导及其他代码的信息,该站点的网址为: www.microsoft.com/vfoxpro 请定期查看该网站,以便下载产品的最新版本。 问题 1-2: 从何处可以得到有关 Visual FoxPro 的详细资料? 答案: 通过 Microsoft Visual FoxPro Web 站点是随时获得各种最新产品发布信息的最佳途径。在此站点上不仅有新的产品公告,而且还提供了产品的更新信息、技术文章、白皮书、专业开发人员设计的优秀示例、会议公告、以及与其他许多 FoxPro web 站点的各种链接。 问题 1-3: 如何获得技术支持,以及如何报告软件错误? 答案: Microsoft Visual FoxPro Web 站点已经链接到了多种联机支持选项,其中包括覆盖面广阔的有关所有产品 Microsoft Knowledge Base(Microsoft 知识库)。您还可以阅读一份有关常见问题的清单。除联机支持之外,还可以直接通过电话获得技术支持。“帮助”菜单中的选项可列出技术支持的电话号码。这些电话号码也可用于报告产品中的错误。 问题 1-4. 什么是 Knowledge Base?如何使用它? 答案: Knowledge Base 是内容广泛的论文集,覆盖了如何使用产品的各种特性、已知的软件错误及其解决方案或回避的方法、以及其他有助于使用各种 Microsoft 产品的有用信息。通过以下站点可访问整个 Knowledge Base: support.microsoft.com 问题 1-5: 是否会有 Visual FoxPro 6.0a? 答案: Microsoft 公司一向承诺为用户提供高质量的产品。如果确实需要,我们将提供 Visual FoxPro 6.0 的错误修订版。但是,修订版不会使用 6.0a 版的形式。Visual FoxPro 6.0 中任何错误的修正都将包含在 Visual Studio Service Pack 中。同时还会在 Visual FoxPro 的 www.microsoft.com/vfoxpro 或 Visual Studio 的www.microsoft.com/vstudio 的 Web 站点上发布修订公告。 问题 1-6: Microsoft 公司为应用程序的开发提供了一些优秀的解决方案。怎样才能知道应该向客户推荐和使用哪种产品? 答案: 在选择适用某项任务的产品时,需要考虑多方面的因素。Microsoft Visual FoxPro web 站点上有一份优秀的策略背景论文,它比较了 Visual FoxPro、Visual Basic、SQL Server 和 Access 等 Microsoft 产品之间的不同。 问题 1-7: 哪里可以找到 Visual FoxPro 的使用示例? 答案: Visual FoxPro 6.0 产品中带有丰富的示例,其中有一些是针对 6.0 版特有功能的新示例。与 Visual FoxPro 以前的版本不同,这些示例将与所有 Visual Studio 示例安装在一起。您必须运行 MSDN Library 的“自定义”安装来安装这些示例。在 Visual FoxPro 中可使用新的 HOME(2) 函数方便地找到已安装示例的位置。 除了产品中所自带的示例外,Microsoft Visual FoxPro web 站点还将经常提供新的示例。

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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