仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 905|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL网站制作之一个复杂的考勤体系

[复制链接]
老尸 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:25:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
限制,如果WHERE子句的查询条件里有不等号(WHEREcoloum!=),MySQL将无法使用索引。类似地,如果WHERE子句的查询条件里使用了函数(WHEREDAY(column)=),MySQL也将无法使用索引。
不思索加班,告假,外出之类。

原始纪录表:
1:事情日历表calendar
2:排班表worktime
3:人事材料表employee
4:非常种别表(早退,迟到,无刷卡...)abnormity
5:考勤纪录表timecard


处置了局表:(能够用表或视图的情势寄存)
1:打卡非常1000120031102上午下班早退
2:考勤明细表1:100012003110107:55/12:01/12:02/13:55/18:00/18:01列出一切打卡明细
3:考勤明细表2:100012003110107:5512:0113:5518:00



/*事情日历表:
以下假定只要三种事情日历,默许情形以下
1:礼拜六和礼拜天不下班
2:礼拜天不下班
4:天天都下班
*/
createtablecalendar(
datesmalldatetimeprimarykeyclustered,
flag1bit,
flag2bit,
flag3bit
)
execsp_addextendedpropertyNMS_Description,N日期,Nuser,Ndbo,Ntable,Ncalendar,Ncolumn,Ndate
execsp_addextendedpropertyNMS_Description,N是不是下班1,Nuser,Ndbo,Ntable,Ncalendar,Ncolumn,Nflag1
execsp_addextendedpropertyNMS_Description,N是不是下班2,Nuser,Ndbo,Ntable,Ncalendar,Ncolumn,Nflag2
execsp_addextendedpropertyNMS_Description,N是不是下班3,Nuser,Ndbo,Ntable,Ncalendar,Ncolumn,Nflag3
/*一般录进材料
insertcalendarselect20031101,0,1,1
unionallselect20031102,0,0,1
unionallselect20031103,1,1,1
unionallselect20031104,1,1,1
*/

/*********以下存储历程用于批量录进材料**************/
createProcedureAddWorkCalendar@BDateSmallDateTime,@EDateSmallDateTime
As
Declare@CDateSmallDateTime
Declare@Flag1Bit
Declare@Flag2Bit
Declare@Flag3Bit

Set@CDate=@BDate
IfExists(Select*fromcalendarWherecld_rqBetween@BDateAnd@EDate)
Begin
Raiserror(已有该局限的材料,请查对入手下手日期和停止日期!!!,16,-1)
Return
End
While@CDate<=@EDate
Begin
Set@Flag1=(CaseWhenDatePart(WeekDay,@CDate)in(1,7)then0Else1End)
Set@Flag2=(CaseWhenDatePart(WeekDay,@CDate)=1then0Else1End)
Set@Flag3=1
InsertcalendarValues(@CDate,@Flag,@Flag1,@Flag2)
Set@CDate=DateAdd(Day,1,@CDate)
End

/********Usage:
ExecAddWorkCalendar20031101,20031130
*********/

/*************
固然,更天真的办法是以下体例建表:
日期   体例   标记
2001110110
2001110121
2001110131
...
********************/



/*
2:排班表(为复杂起见,不思索加班的排班,且只思索一天最多需四次刷卡的情形)
*/
createtableworktime(
worktimeidintprimarykeyclustered,
minbchar(5),
minschar(5),
minechar(5),
moutbchar(5),
moutschar(5),
moutechar(5),
ainbchar(5),
ainschar(5),
ainechar(5),
aoutbchar(5),
aoutschar(5),
aoutechar(5)
)
go
execsp_addextendedpropertyNMS_Description,N班制编号,Nuser,Ndbo,Ntable,Nworktime,Ncolumn,Nworktimeid
execsp_addextendedpropertyNMS_Description,N上午下班始,Nuser,Ndbo,Ntable,Nworktime,Ncolumn,Nminb
execsp_addextendedpropertyNMS_Description,N上午下班尺度,Nuser,Ndbo,Ntable,Nworktime,Ncolumn,Nmins
execsp_addextendedpropertyNMS_Description,N上午下班止,Nuser,Ndbo,Ntable,Nworktime,Ncolumn,Nmine
execsp_addextendedpropertyNMS_Description,N上午上班始,Nuser,Ndbo,Ntable,Nworktime,Ncolumn,Nmoutb
execsp_addextendedpropertyNMS_Description,N上午上班尺度,Nuser,Ndbo,Ntable,Nworktime,Ncolumn,Nmouts
execsp_addextendedpropertyNMS_Description,N上午上班止,Nuser,Ndbo,Ntable,Nworktime,Ncolumn,Nmoute

execsp_addextendedpropertyNMS_Description,N下战书下班始,Nuser,Ndbo,Ntable,Nworktime,Ncolumn,Nainb
execsp_addextendedpropertyNMS_Description,N下战书下班尺度,Nuser,Ndbo,Ntable,Nworktime,Ncolumn,Nains
execsp_addextendedpropertyNMS_Description,N下战书下班止,Nuser,Ndbo,Ntable,Nworktime,Ncolumn,Naine
execsp_addextendedpropertyNMS_Description,N下战书上班始,Nuser,Ndbo,Ntable,Nworktime,Ncolumn,Naoutb
execsp_addextendedpropertyNMS_Description,N下战书上班尺度,Nuser,Ndbo,Ntable,Nworktime,Ncolumn,Naouts
execsp_addextendedpropertyNMS_Description,N下战书上班止,Nuser,Ndbo,Ntable,Nworktime,Ncolumn,Naoute
/*
注:在下班始-下班尺度间打卡属于一般打卡,在下班尺度-下班止间打卡属于早退
  鄙人班始-上班尺度间打卡属于迟到,鄙人班尺度-上班止间打卡属于一般打卡
  其他工夫打卡属于有效打卡。
*/

--3:人事材料表(只列出与考勤有关的字段)
createtableemployee(
worknochar(6)primarykey,
[name]varchar(10),
calendarFlagintcheck(calendarFlagin(1,2,3)),--1,2,3分离暗示事情日历中的标记1,标记2,标记3
worktimeidint--排班表中的班制
)
go
execsp_addextendedpropertyNMS_Description,N工号,Nuser,Ndbo,Ntable,Nemployee,Ncolumn,Nworkno
execsp_addextendedpropertyNMS_Description,N姓名,Nuser,Ndbo,Ntable,Nemployee,Ncolumn,Nname
execsp_addextendedpropertyNMS_Description,N事情日历体例,Nuser,Ndbo,Ntable,Nemployee,Ncolumn,NcalendarFlag
execsp_addextendedpropertyNMS_Description,N班制,Nuser,Ndbo,Ntable,Nemployee,Ncolumn,Nworktimeid

/*
calendarFlag1,2,3分离暗示事情日历中的标记1,标记2,标记3
worktimeid对应排班表中的班制
*/


--4:非常种别表abnormity
createtableabnormity(
abnormitynointprimarykeyclustered,
[description]varchar(10)
)
go
execsp_addextendedpropertyNMS_Description,N非常种别,Nuser,Ndbo,Ntable,Nabnormity,Ncolumn,Nabnormityno
execsp_addextendedpropertyNMS_Description,N非常申明,Nuser,Ndbo,Ntable,Nabnormity,Ncolumn,Ndescription

/**************
非常包含:早退(还可细分红早退的工夫段),迟到,无刷卡...
固然大概另有扣薪体例之类的,此处不予思索。
*****************/





5:考勤纪录表timecard
createtabletimecard(
worknochar(6),
[date]datetime,
constraint[pk_timecard]primarykeyclustered
(
workno,
[date]
)ON[PRIMARY]
)
go
execsp_addextendedpropertyNMS_Description,N工号,Nuser,Ndbo,Ntable,Ntimecard,Ncolumn,Nworkno
execsp_addextendedpropertyNMS_Description,N打卡工夫,Nuser,Ndbo,Ntable,Ntimecard,Ncolumn,Ndate

/*******
实在我实践中是按卡号(对应工号),日期,工夫,卡钟号  四个字段来存的。
*******/




/****************以下处置失掉 考勤明细表1:**********/
--1.创立一个兼并的函数
createfunctionf_kqlist(@worknochar(6),@datechar(8))
returnsvarchar(400)
as
begin
declare@strvarchar(1000)
set@str=
select@str=@str+/+convert(char(8),[date],108)fromtimecard
whereworkno=@worknoanddatediff(day,[date],@date)=0
set@str=right(@str,len(@str)-1)
return(@str)
End

/*Usage:
selectdistinctworkno,date,dbo.f_kqlist(workno,[date])
fromtimecard
whereworkno=102337andconvert(char(8),[date],112)=20030814
*/

剩下的留给人人吧。实在也不难,就看谁的效力对照高一些而已。:D
(我的做法: 非常处置:用存储历程,用游标做的,懒得往优化了
   考勤明细表2: 用函数,本来用游标,欠好,厥后才改用函数的)


但我们知道,若使用statement,并没有上述需要的数据。试想binlog中记录了一句updatetsetf1=3whereid=3。怎么恢复呢?
谁可相欹 该用户已被删除
沙发
发表于 2015-1-19 11:24:56 | 只看该作者
同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。
第二个灵魂 该用户已被删除
板凳
发表于 2015-1-27 23:15:50 | 只看该作者
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
爱飞 该用户已被删除
地板
发表于 2015-2-5 14:12:38 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
海妖 该用户已被删除
5#
发表于 2015-2-12 03:33:36 | 只看该作者
sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西
简单生活 该用户已被删除
6#
发表于 2015-3-2 22:11:50 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
愤怒的大鸟 该用户已被删除
7#
发表于 2015-3-11 06:53:49 | 只看该作者
大侠们有推荐的书籍和学习方法写下吧。
若天明 该用户已被删除
8#
发表于 2015-3-17 23:06:51 | 只看该作者
另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);
不帅 该用户已被删除
9#
发表于 2015-3-25 05:23:01 | 只看该作者
对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-3 22:24

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表