51Testing软件测试论坛

标题: SQL server 查询问题 [打印本页]

作者: roadxizi    时间: 2007-1-26 16:52
标题: SQL server 查询问题
1.查找每个人每天最早和最完的记录,

2.并用最早和最完的记录,与"09:00:00"和"18:00:00"做比较,计算出迟到或早退的分钟数.

3.最后统计每个人每个月迟到和早退的次数和总的分钟数.
作者: Spark.lee    时间: 2007-1-26 16:57
标题: 你想搞什么啊
纯粹的SQL问题/.??/
作者: roadxizi    时间: 2007-1-26 17:11
员工考勤啊
作者: Spark.lee    时间: 2007-1-26 17:12
标题: 你是纯粹的想写查询句子是吧!!
不是别的什么啊
作者: roadxizi    时间: 2007-1-26 17:19
你不会要给我删吧?
作者: Spark.lee    时间: 2007-1-26 17:38
标题:
你居然这样想的
本来想 告诉你怎么搞的

没有指望了 你
作者: roadxizi    时间: 2007-1-26 17:56
哈哈,就是要纯粹的语句
作者: hanjj    时间: 2007-1-26 23:26
标题: 问题不明白
不是很明白你的问题,为什么每个人一天有那么多次签到?????
如果上班签到,为什么王佳2006-12-20,有3次上班签到????
作者: netcat    时间: 2007-1-29 08:27
这个你把正常上班也就是“签到。。签退”,为一个工1,其他情况,不全的,先签退,再签到;或者就签一次的为旷工0,或者记半天工,这样便于你分析。再根据你要求的时间来筛选。。。
具体写的要根据你自己的表来调用拉,
作者: netcat    时间: 2007-1-29 08:32
没有严格按要求正常上。。下。完整班次的,君按 旷工处理也就是0,半个工设为0.5,看你的意思,
有完整上下班的,按最后一次签到,到第一次签退的时间结算。为1,但是中间时间的间隔,也就是你们公司规定的上班到下班的签到时间,大于一定时间的也按0.5,还有早退现象,你自己想吧
重要的你设置参数。。1.        0         .0.5       如何用时间段来给他们定义,
作者: roadxizi    时间: 2007-1-29 09:47
我们公司那个门是指纹鉴定开关,出入都的用指纹来开门,所以会有多条记录.
作者: windsmile    时间: 2007-1-29 10:02
原帖由 roadxizi 于 2007-1-29 09:47 发表
我们公司那个门是指纹鉴定开关,出入都的用指纹来开门,所以会有多条记录.

挺先进的!不过签到和开门应该分开记录吧!
作者: ecust    时间: 2007-1-29 10:14
挺麻烦的。。。
纯SQL的话。。。。
嵌套条件比较多,而且SQL SERVER在做子查询的时候,返回结果不能超过一个,不然会导致ODBC 错误
作者: roadxizi    时间: 2007-1-29 10:14
那里那里,买人家个东西用了,

我现在问的问题了查找记录,

呵呵  并不是设置那个指纹鉴定器
作者: ecust    时间: 2007-1-29 11:16
最晚记录可以这么写:
SELECT MAX(日期时间) AS Expr1, 姓名
FROM 表名
WHERE (日期时间 BETWEEN '2005-8-1 00:00:00' AND '2005-8-1 23:59:59') AND
      (姓名 = 'ecust')
GROUP BY 姓名

姓名可以做嵌套查询:  SELECT DISTINCT 姓名 FROM 表名
作者: sunxy5291    时间: 2007-1-29 11:32
楼主是要sql语句吗?
作者: roadxizi    时间: 2007-1-29 11:50
(姓名 = 'ecust')  感觉不对,因为不知道谁走的最晚,

WHERE 条件里怎么就固定了姓名了呢?
作者: sunxy5291    时间: 2007-1-29 11:56
最早:
select * from table1 where not exists (select id from table1 where id = a.id and 日期时间 < a.日期时间) as a

最晚:
select * from table1 where not exists(select * from table1 where id = a.id and 日期时间 > a.日期时间) as a
作者: sunxy5291    时间: 2007-1-29 12:04
标题: 好像不对了,对于某一个人id不唯一,不能关联!应该这样写:
最早时间:
select * from table1 where not exists (select id from table1 where 姓名 = a.姓名 and 日期时间 < a.日期时间) as a

最晚时间:
select * from table1 where not exists(select * from table1 where 姓名 = a.姓名 and 日期时间 > a.日期时间) as a
作者: sunxy5291    时间: 2007-1-29 12:06
以上是1的回答,请楼主检查
2、3我认为还比较难,等吃完饭回来研究!
作者: roadxizi    时间: 2007-1-29 12:35
好的,谢谢
作者: ecust    时间: 2007-1-29 13:02
原帖由 roadxizi 于 2007-1-29 11:50 发表
(姓名 = 'ecust')  感觉不对,因为不知道谁走的最晚,

WHERE 条件里怎么就固定了姓名了呢?

你不是要知道每个人么?
就有了姓名的条件,下面的姓名嵌套查询加进去就会有不同的名字进去。
查找出不同的人每天的最晚的记录。
如果你要知道谁最晚,而不是每一个人的最晚,那去掉where的条件就可以了
作者: roadxizi    时间: 2007-1-29 13:25
说的我都快不明白了.

我是要每个人的最早和最晚记录,

到是可以按照姓名分组,所有员工某天的最早和最晚记录都出来
作者: sunxy5291    时间: 2007-1-29 14:00
2、3我是不会了
不过我帮你问问别的高手!
作者: ecust    时间: 2007-1-29 15:03
纯SQL写是一个很痛苦的事情,我感觉。。。
干吗要这种方式列。。。
作者: sunxy5291    时间: 2007-1-29 15:04
标题: 看这个答案可以吗,我也不会做,别人帮忙做的
2.
迟到分钟:
select 姓名,DATEDIFF(minute,cast((convert(char(10),日期时间,120) + ' 09:00:00') as datetime),日期时间) as 迟到分钟 from table1 where not exists (select id from table1 where 姓名 = a.姓名 and 日期时间 < a.日期时间) as a

早退分钟:
select 姓名,DATEDIFF(minute,日期时间,cast((convert(char(10),日期时间,120) + ' 18:00:00') as datetime),) as 迟到分钟 from table1 where not exists(select * from table1 where 姓名 = a.姓名 and 日期时间 > a.日期时间) as a
作者: roadxizi    时间: 2007-1-30 14:42
修改以后对了,谢谢了
作者: sunxy5291    时间: 2007-1-30 16:49
对了?
那你都修改什么啦
发出来
作者: roadxizi    时间: 2007-1-30 18:15
select 姓名,DATEDIFF(minute,cast((convert(char(10),日期时间,120) + ' 09:00:00') as datetime),日期时间) as 迟到分钟

from [考勤报表] a

where not exists

(

select id from [考勤报表]

where 姓名 = a.姓名

and 日期时间 < a.日期时间

)
作者: sunxy5291    时间: 2007-1-31 09:11
把所有的都类出来,这里是bbs你要让大家都学习啊!
作者: roadxizi    时间: 2007-1-31 09:36
set ANSI_NULLS OFF
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[get_yuangong_chidao_xx_cdzt]
(
        @name varchar(100),
        @date datetime,
        @type varchar(100)
)
AS


declare @Year int,@Month int,@Day int,@Minute int,@Minute2 int
set @Year=year(@date)
set @Month=month(@date)
set @Minute=9*60+3
set @Minute2=18*60+3

if @type='迟到统计'
begin
select [姓名],[编号],[日期时间],[type],[type2],DATEDIFF(minute,cast((convert(char(10),[日期时间],120) + ' 09:00:00') as datetime),日期时间) as '分钟数'
from
(
        select *,'迟到' as [type],day(DATEADD("Day",1,[日期时间]))-day(DATEADD("Minute", 0-@Minute, DATEADD("Day",1,[日期时间]))) as [type2]
        from [考勤报表] a
        where
        ID =
        (
        select top 1 ID
        from [考勤报表] b
        where year(b.[日期时间])=@Year and month(b.[日期时间])=@Month and day(b.[日期时间])=day(a.[日期时间]) and b.[编号]=a.[编号]
        order by b.[日期时间] asc
        )
)c

where [type2]=0

and [姓名]=@name

and year([日期时间])=year(@date)

and month([日期时间])=month(@date)

order by [日期时间]

end

else

begin

select [姓名],[编号],[日期时间],[type],[type2],DATEDIFF(minute,[日期时间],cast((convert(char(10),[日期时间],120) + ' 18:00:00') as datetime)) as '分钟数'
from
(
        select *,'早退' as [type],1-(day(DATEADD("Day",1,[日期时间]))-day(DATEADD("Minute", 0-@Minute2, DATEADD("Day",1,[日期时间])))) as [type2]
        from [考勤报表] a
        where ID =
        (
        select top 1 ID
        from [考勤报表] b
        where year(b.[日期时间])=@Year and month(b.[日期时间])=@Month and day(b.[日期时间])=day(a.[日期时间]) and b.[编号]=a.[编号]
        order by b.[日期时间] desc
        )

)c
--where [编号]=208
--and day(a.[日期时间])=1
--order by [编号],[日期时间],[type]

where [type2]=0

and [姓名]=@name

and year([日期时间])=year(@date)

and month([日期时间])=month(@date)

order by [日期时间]

end
作者: sunxy5291    时间: 2007-1-31 10:10
这不是存储过程吗?
你不是3道题目吗,逐一列出不更明了一些!
作者: roadxizi    时间: 2007-1-31 10:52
都列出来也都一样

都是上面的代码
作者: roadxizi    时间: 2007-1-31 10:54
set ANSI_NULLS OFF
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[get_yuangong_chidao]
(
        @date datetime
)
AS
declare @Year int,@Month int,@Day int,@Minute int,@Minute2 int
set @Year=year(@date)
set @Month=month(@date)
set @Minute=9*60
set @Minute2=18*60
select [姓名],[编号],count([type2]) as '迟到早退次数'
from
(
        select *,'i' as [type],day(DATEADD("Day",1,[日期时间]))-day(DATEADD("Minute", 0-@Minute, DATEADD("Day",1,[日期时间]))) as [type2]
        from [考勤报表] a
        where
        ID =
        (
        select top 1 ID
        from [考勤报表] b
        where year(b.[日期时间])=@Year and month(b.[日期时间])=@Month and day(b.[日期时间])=day(a.[日期时间]) and b.[编号]=a.[编号]
        order by b.[日期时间] asc
        )
        union all
        select *,'o' as [type],1-(day(DATEADD("Day",1,[日期时间]))-day(DATEADD("Minute", 0-@Minute2, DATEADD("Day",1,[日期时间])))) as [type2]
        from [考勤报表] a
        where ID =
        (
        select top 1 ID
        from [考勤报表] b
        where year(b.[日期时间])=@Year and month(b.[日期时间])=@Month and day(b.[日期时间])=day(a.[日期时间]) and b.[编号]=a.[编号]
        order by b.[日期时间] desc
        )
)c
--where [编号]=208
--and day(a.[日期时间])=1
--order by [编号],[日期时间],[type]

where [type2]=0

and year([日期时间])=year(@date)

and month([日期时间])=month(@date)

group by [姓名],[编号]
作者: rainyday32    时间: 2007-1-31 11:02
还在学习SQL,上面的这些还需要努力才能看明白阿~
作者: keibi    时间: 2007-2-6 19:17
用临时表很容易处理了
作者: roadxizi    时间: 2007-2-7 09:44
怎么个处理法?




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2