‘壹’ sql查询在某段时间内某用户的缺勤次数
SELECT COUNT(T1.USERID)
FROM XXX T1
WHERE T1.USERID='001'
AND T1.SIGNTYPE = '2'
AND TO_CHAR(T1.SIGNTIME,'YYYYMMDD') BETWEEN '20100101' AND '20101231'
AND NOT EXISTS (
SELECT 1
FROM XXX T2
WHERE T2.USERID='001'
AND T2.SIGNTYPE != '2'
AND TO_CHAR(T2.SIGNTIME,'YYYYMMDD') = TO_CHAR(T1.SIGNTIME,'YYYYMMDD')
)
--字段数据前提假设:SIGNTIME为DATE类型,并且同一天正常情况下应该只有1条签到数据,1条签退数据.
--条件:假设用户ID是001,统计时间段是20100101-20101231
刚重装完系统,还没装ORACLE,未经调试,根据你实际的数据情况做修改吧
‘贰’ SQL考勤的问题,目前考勤只能查到每天签到签退的成员,写什么语句能查到没有签到签退的成员
从全体名单里筛除签到的成员即可。
select * from 全体成员表 where 成员 not in (select 成员 from 签到签退表)
‘叁’ sql语句实现考勤报表,sql语句怎样实现员工同一天只有两次考勤
两次考勤:select 员工ID,TRUNC(TIME,'d') FROM 考勤表 group by 员工ID,TRUNC(TIME,'d')
having count(*)=2;
漏打:select 员工ID,TRUNC(TIME,'d') FROM 考勤表 group by 员工ID,TRUNC(TIME,'d')
having count(*)<2;
‘肆’ java如何防止用户一天内2次或多次执行某操作,比如考勤,一天内只能签到一次
在表里加一列操作时间
来操作的时候判断一下就可以了
‘伍’ 一个sql语句的问题
弱弱的问一句,什么数据库?
再一个,你把各个时间点也给一下,譬如早8点算正常上班,这种信息你也该给出来的,顺便给你点提示
这种东西按一对一对来算,譬如上午签到和签退算一对,那么如果签到时间>8点或签退时间<11点则算旷工半天,所以不能考虑除以4的情况
还是先把什么数据库弄出来吧,要不时间函数都不一样,不太好弄,还有最好列举几条数据
---补充---
id,编号 signTime,签到时间 signDate,签到日期 signNum,签到次序 username,签到人 signState,签到状态
create table test (id int,
signTime varchar(8),
signDate varchar(10),
signNum int,
username varchar(20),
signState varchar(4));
insert into test values (1,'08:00:00', '2010-08-07',1,'张三','A');
insert into test values (1,'11:30:00', '2010-08-07',2,'张三','A');
insert into test values (1,'13:00:00', '2010-08-07',3,'张三','A');
insert into test values (1,'17:00:00', '2010-08-07',4,'张三','A');
insert into test values (1,'08:00:00', '2010-08-08',1,'张三','A');
insert into test values (1,'11:30:00', '2010-08-08',2,'张三','A');
insert into test values (1,'13:00:00', '2010-08-08',3,'张三','A');
insert into test values (1,'16:00:00', '2010-08-08',4,'张三','A');
insert into test values (1,'07:00:00', '2010-08-07',1,'李四','A');
insert into test values (1,'10:30:00', '2010-08-07',2,'李四','A');
insert into test values (1,'14:00:00', '2010-08-07',3,'李四','A');
insert into test values (1,'17:00:00', '2010-08-07',4,'李四','A');
insert into test values (1,'08:00:00', '2010-08-08',1,'李四','A');
insert into test values (1,'12:00:00', '2010-08-08',2,'李四','A');
insert into test values (1,'13:00:00', '2010-08-08',3,'李四','A');
insert into test values (1,'17:00:00', '2010-08-08',4,'李四','A');
insert into test values (1,'08:00:00', '2010-08-08',1,'王五','A');
insert into test values (1,'12:00:00', '2010-08-08',2,'王五','A');
insert into test values (1,'13:00:00', '2010-08-08',3,'王五','A');
select username,(morning+afternoon) 出勤天数 from
(select f.username username,sum(case when f.morning_sb=1 and f.morning_xb=1 then 0.5 else 0 end) morning,
sum(case when f.afternoon_sb=1 and f.afternoon_xb=1 then 0.5 else 0 end) afternoon
from
(select a.signDate signDate,a.username username,
case when b.morning_sb =1 then 1 else 0 end morning_sb ,
case when c.morning_xb =1 then 1 else 0 end morning_xb,
case when d.afternoon_sb =1 then 1 else 0 end afternoon_sb,
case when e.afternoon_xb =1 then 1 else 0 end afternoon_xb
from
(select a.signDate signDate,b.username username from
(select distinct signDate signDate from test where signdate between '2010-08-07' and '2010-08-08' ) a,
(select distinct username username from test) b) a
left join
(select signDate,username,case when signTime between '06:00:00' and '08:00:00' then 1 else 0 end morning_sb from test where signNum=1 and signDate between '2010-08-07' and '2010-08-08') b
on a.signDate=b.signDate
and a.username=b.username
left join
(select signDate,username,case when signTime between '11:00:00' and '13:00:00' then 1 else 0 end morning_xb from test where signNum=2 and signDate between '2010-08-07' and '2010-08-08') c
on b.signDate=c.signDate
and b.username=c.username
left join
(select signDate,username,case when signTime between '11:00:00' and '13:00:00' then 1 else 0 end afternoon_sb from test where signNum=3 and signDate between '2010-08-07' and '2010-08-08') d
on b.signDate=d.signDate
and b.username=d.username
left join
(select signDate,username,case when signTime between '17:00:00' and '23:59:59' then 1 else 0 end afternoon_xb from test where signNum=4 and signDate between '2010-08-07' and '2010-08-08') e
on b.signDate=e.signDate
and b.username=e.username) f
group by f.username) g
大概基本所有情况都考虑进去了,不懂的HI我吧,写了很多,加测试大概用了一个小时
我算的是早8点-11点是上班时间,下午13点-17点是上班时间,可能有的地方写的不对,你凑合看吧,估计看起来很累
-------------补充--------------
你都没仔细看我写的这堆吧?
其实都差不多,只要你改其中几个地方就OK了
1,咱俩时间格式不一样,我是2010-08-29,你是2010-8-29,时间我精确到了秒,你精确到了分钟
2,运行过程中,我没考虑最后的状态,因为靠时间点就能来判断是迟到或早退了
‘陆’ 每日签到系统,如何实现每日只能签到一次而不是多次这个限制
数据库肯定是要用的,如果不用数据库没办法实现的,再增加一个字段用于标记是否签到,签到标记为1就可以了,这样就能判断是否已经签到了
‘柒’ 求数据库高手写一个SQL语句
select
userid
as
用户ID,count(userid)
as
当天签到次数
from
表名
group
by
ip,time
having
count(userid)>=3
希望能帮到你
‘捌’ 如何用c语言编写一个签到的程序,一天只能签到一次,不能重复签到,最好是给代码,如果麻烦的话,要用到
要看签到的方式,时间点签到,还是时间段签到。你可以试试用定时器做,定时器的话c语言有sleep函数,mfc中有settimer定时器,这个最好看你的题目具体的要求。签到函数,无非就是判断状态。
‘玖’ sql关于查询考勤系统查询
再建立一个上班日期表,表内时应上班日期,因有节假日问题,如果是餐饮这种每人不固定的情况,只能建立人员上班情况表了。
建立存储过程
循环一,人员档案;
循环二,上班日期表,找出本月应上班的日期;
缺勤天数变量,签到表日期不在上班日期表的,为缺勤,count出天数
循环三,签到表;
缺勤时间,签到表中时间对不上,上下班时间的进行累计;
有请假、倒休、公休情况,找到对应的请假表,进行对比,调整缺勤天数和缺勤时间变量。
‘拾’ SQL2000数据库问题,现在有两张表,一张员工表和一张每日签到表,能不能建立一个触发器
这个需要建一个存储过程和一个数据库作业和一个返回随机时间段的函数才能实现
如果有A表(员工),sUserCode,B表(签到表),sUserCode,dtSignInDate
-- 返回随机时间段的函数
Create Function RandDateTime(@RandNum Decimal(38,18),@StartTime DateTime,@EndTime DateTime)
Returns DateTime
As
Begin
Declare @HourDiff Decimal(38,18)--两个时间之间的小时差值
Declare @MinutePartDiff Decimal(38,18)--分钟部分的差值
Declare @SecondPartDiff Decimal(38,18)--秒部分的差值
Declare @MsPartDiff Decimal(38,18)--毫秒部分的差值
Declare @SmallDate DateTime
Declare @BigDate DateTime
Declare @ReturnDateTime DateTime
/*取各部分差值*/
Set @MsPartDiff = Abs(Convert(Decimal(38,18),DatePart(ms,@EndTime)-DatePart(ms,@StartTime)))
Set @SecondPartDiff = Abs(Convert(Decimal(38,18),DatePart(s,@EndTime)-DatePart(s,@StartTime)))
Set @MinutePartDiff = Abs(Convert(Decimal(38,18),DatePart(mi,@EndTime)-DatePart(mi,@StartTime)))
Set @HourDiff = DateDiff(hh,@StartTime,@EndTime)
Set @SmallDate = @StartTime
Set @BigDate = @EndTime
If @HourDiff <0
Begin
Set @SmallDate = @EndTime
Set @BigDate = @StartTime
Set @HourDiff = -@HourDiff
End
ActionLable:
Declare @HourDecimal Decimal(38,18)--小时的小数部分
Declare @HourString varchar(200)
Set @HourDiff = @HourDiff * @RandNum
Set @HourString = CONVERT(VARCHAR(200),@HourDiff)
Set @HourString = SubString(@HourString,CharIndex('.',@HourString)+1,Len(@HourString))
Set @HourString = '0.' + @HourString
Set @HourDecimal = Convert(Decimal(38,18),@HourString)
Set @MsPartDiff = (@MsPartDiff + @SecondPartDiff * 1000 + @MinutePartDiff*1000*60 + @HourDecimal * 3600*1000) * @RandNum
Set @ReturnDateTime = DateAdd(hh,@HourDiff,@SmallDate)
Set @ReturnDateTime = DateAdd(ms,@MsPartDiff,@ReturnDateTime)
Return @ReturnDateTime
End
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
-- 自动签到存储过程
Create procere p_AutoSignIn
begin
-- @startdate 打卡开始时间
-- @enddate 打卡结束时间
declare @startDate datetime
declare @enddate datetime
set @startDate=getdate()
set @endDate=dateadd(n,[20],@startDate) 可以换成自己需要的时间差值
-- a表示0-1 之间的随机数值,可用小数
insert into B(sUserCode,dtSignInDate)
select sUserCode,RandDatetime (a,@startdate,@enddate) from A
end
-- 创建计划作业
企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句:
update base set flag=0 where datediff(dd,date,getdate())=0
--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排为一天一次
然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行
设置方法:
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.