工资类程序数据库处理讨论 [数据加载(一)]
数据加载
加载原则:
按月加载;指定部门中当月存在人员,即当月非离厂,非退休,新增人员
按年加载;当年存在过的人员,不分离厂与退休
一, 按月加载
数据库体现:
指定部门中非离厂,非退休,新增人员
LEFT(CONVERT(NVARCHAR(20),ISNULL(dInDate,'1901-1-1'),112),6)<=LEFT(CONVERT(NVARCHAR(20),GETDATE(),112),6) AND --比较进厂时间
LEFT(CONVERT(NVARCHAR(20),ISNULL(CAST(dLeaveDate AS DATETIME),'9999-1-1'),112),6)>LEFT(CONVERT(NVARCHAR(20),GETDATE(),112),6) AND --比较离厂时间
LEFT(CONVERT(NVARCHAR(20),ISNULL(CAST(dRetireDate AS DATETIME),'9999-1-1'),112),6)>LEFT(CONVERT(NVARCHAR(20),GETDATE(),112),6) AND --比较退休时间
cDepCode LIKE 'xxx%' --筛选部门
--进厂时间比查询日期早,退休与离厂时间都比当前日期晚
LEFT(CONVERT(NVARCHAR(20),ISNULL(CAST(dLeaveDate AS DATETIME),'9999-1-1'),112),6)>LEFT(CONVERT(NVARCHAR(20),GETDATE(),112),6) AND --比较离厂时间
LEFT(CONVERT(NVARCHAR(20),ISNULL(CAST(dRetireDate AS DATETIME),'9999-1-1'),112),6)>LEFT(CONVERT(NVARCHAR(20),GETDATE(),112),6) AND --比较退休时间
cDepCode LIKE 'xxx%' --筛选部门
--进厂时间比查询日期早,退休与离厂时间都比当前日期晚
下面的查询是正常的数据筛选,
但存在一个部门调动问题.
即在筛选未经输入的人员并指定了筛选部门时可能会把已经调动过的人员一起选出来(具体看代码后的说明)
declare @curDate smalldatetime
declare @depCode nvarchar(30)
set @curDate='2005-1-1'
set @depCode='101124'
--已存在工资数据
SELECT wa.cPsnCode,cPsnName,wa.cDepCode,cDepName,IT_14
FROM
WAData_2005 wa
INNER JOIN Department d
ON wa.cDepCode=d.cDepCode
INNER JOIN Person p
ON wa.cPsnCode=p.cPsnCode
WHERE iPeriod=MONTH(@curDate) AND iYear=YEAR(@curDate) AND wa.cDepCode LIKE @depCode+'%'
UNION ALL
--未经输入的人员
SELECT cPsnCode,cPsnName,p.cDepCode,cDepName,NULL
FROM
Person p
INNER JOIN Department d
ON p.cDepCode=d.cDepCode
WHERE
LEFT(CONVERT(NVARCHAR(20),ISNULL(dInDate,'1901-1-1'),112),6)<=LEFT(CONVERT(NVARCHAR(20),@curDate,112),6) AND --比较进厂时间
LEFT(CONVERT(NVARCHAR(20),ISNULL(CAST(dLeaveDate AS DATETIME),'9999-1-1'),112),6)>LEFT(CONVERT(NVARCHAR(20),@curDate,112),6) AND --比较离厂时间
LEFT(CONVERT(NVARCHAR(20),ISNULL(CAST(dRetireDate AS DATETIME),'9999-1-1'),112),6)>LEFT(CONVERT(NVARCHAR(20),@curDate,112),6) AND --比较退休时间
p.cDepCode LIKE @depCode+'%' AND --选择部门
cPsnCode NOT IN (SELECT cPsnCode FROM WAData_2005 WHERE iPeriod=MONTH(@curDate) AND iYear=YEAR(@curDate) AND cDepCode LIKE @depCode+'%')
declare @depCode nvarchar(30)
set @curDate='2005-1-1'
set @depCode='101124'
--已存在工资数据
SELECT wa.cPsnCode,cPsnName,wa.cDepCode,cDepName,IT_14
FROM
WAData_2005 wa
INNER JOIN Department d
ON wa.cDepCode=d.cDepCode
INNER JOIN Person p
ON wa.cPsnCode=p.cPsnCode
WHERE iPeriod=MONTH(@curDate) AND iYear=YEAR(@curDate) AND wa.cDepCode LIKE @depCode+'%'
UNION ALL
--未经输入的人员
SELECT cPsnCode,cPsnName,p.cDepCode,cDepName,NULL
FROM
Person p
INNER JOIN Department d
ON p.cDepCode=d.cDepCode
WHERE
LEFT(CONVERT(NVARCHAR(20),ISNULL(dInDate,'1901-1-1'),112),6)<=LEFT(CONVERT(NVARCHAR(20),@curDate,112),6) AND --比较进厂时间
LEFT(CONVERT(NVARCHAR(20),ISNULL(CAST(dLeaveDate AS DATETIME),'9999-1-1'),112),6)>LEFT(CONVERT(NVARCHAR(20),@curDate,112),6) AND --比较离厂时间
LEFT(CONVERT(NVARCHAR(20),ISNULL(CAST(dRetireDate AS DATETIME),'9999-1-1'),112),6)>LEFT(CONVERT(NVARCHAR(20),@curDate,112),6) AND --比较退休时间
p.cDepCode LIKE @depCode+'%' AND --选择部门
cPsnCode NOT IN (SELECT cPsnCode FROM WAData_2005 WHERE iPeriod=MONTH(@curDate) AND iYear=YEAR(@curDate) AND cDepCode LIKE @depCode+'%')
存在的问题:
人员(张三)在四月份从原来的部门(A)调动到新部门(B)后,回过来再用此语句查询三月份的人员时,在部门B中也会出现张三的人,这是由于张三不在下面的查询内
SELECT cPsnCode FROM WAData_2005 WHERE iPeriod=MONTH(@curDate) AND iYear=YEAR(@curDate) AND cDepCode LIKE @depCode+'%'
这个问题可以用月份结帐的方法来处理,即在查询时不进行以上语句的操作,即不将未经输入的人员显示出来
当然也可以用部门调动日期来控制,
但我想换一种方法来做,也就是在上面的代码基础上进行筛选,
还在思考中......................