51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

12
返回列表 发新帖
楼主: roadxizi
打印 上一主题 下一主题

[求助] SQL server 查询问题

[复制链接]

该用户从未签到

21#
 楼主| 发表于 2007-1-29 12:35:10 | 只看该作者
好的,谢谢
回复 支持 反对

使用道具 举报

该用户从未签到

22#
发表于 2007-1-29 13:02:52 | 只看该作者
原帖由 roadxizi 于 2007-1-29 11:50 发表
(姓名 = 'ecust')  感觉不对,因为不知道谁走的最晚,

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

你不是要知道每个人么?
就有了姓名的条件,下面的姓名嵌套查询加进去就会有不同的名字进去。
查找出不同的人每天的最晚的记录。
如果你要知道谁最晚,而不是每一个人的最晚,那去掉where的条件就可以了
回复 支持 反对

使用道具 举报

该用户从未签到

23#
 楼主| 发表于 2007-1-29 13:25:51 | 只看该作者
说的我都快不明白了.

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

到是可以按照姓名分组,所有员工某天的最早和最晚记录都出来
回复 支持 反对

使用道具 举报

该用户从未签到

24#
发表于 2007-1-29 14:00:00 | 只看该作者
2、3我是不会了
不过我帮你问问别的高手!
回复 支持 反对

使用道具 举报

该用户从未签到

25#
发表于 2007-1-29 15:03:11 | 只看该作者
纯SQL写是一个很痛苦的事情,我感觉。。。
干吗要这种方式列。。。
回复 支持 反对

使用道具 举报

该用户从未签到

26#
发表于 2007-1-29 15:04:20 | 只看该作者

看这个答案可以吗,我也不会做,别人帮忙做的

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
回复 支持 反对

使用道具 举报

该用户从未签到

27#
 楼主| 发表于 2007-1-30 14:42:21 | 只看该作者
修改以后对了,谢谢了
回复 支持 反对

使用道具 举报

该用户从未签到

28#
发表于 2007-1-30 16:49:43 | 只看该作者
对了?
那你都修改什么啦
发出来
回复 支持 反对

使用道具 举报

该用户从未签到

29#
 楼主| 发表于 2007-1-30 18:15:50 | 只看该作者
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.日期时间

)
回复 支持 反对

使用道具 举报

该用户从未签到

30#
发表于 2007-1-31 09:11:51 | 只看该作者
把所有的都类出来,这里是bbs你要让大家都学习啊!
回复 支持 反对

使用道具 举报

该用户从未签到

31#
 楼主| 发表于 2007-1-31 09:36:24 | 只看该作者
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
回复 支持 反对

使用道具 举报

该用户从未签到

32#
发表于 2007-1-31 10:10:17 | 只看该作者
这不是存储过程吗?
你不是3道题目吗,逐一列出不更明了一些!
回复 支持 反对

使用道具 举报

该用户从未签到

33#
 楼主| 发表于 2007-1-31 10:52:50 | 只看该作者
都列出来也都一样

都是上面的代码
回复 支持 反对

使用道具 举报

该用户从未签到

34#
 楼主| 发表于 2007-1-31 10:54:58 | 只看该作者
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 [姓名],[编号]
回复 支持 反对

使用道具 举报

该用户从未签到

35#
发表于 2007-1-31 11:02:29 | 只看该作者
还在学习SQL,上面的这些还需要努力才能看明白阿~
回复 支持 反对

使用道具 举报

该用户从未签到

36#
发表于 2007-2-6 19:17:20 | 只看该作者
用临时表很容易处理了
回复 支持 反对

使用道具 举报

该用户从未签到

37#
 楼主| 发表于 2007-2-7 09:44:17 | 只看该作者
怎么个处理法?
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-26 02:52 , Processed in 0.072629 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

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