征集一个查询语句

I_am_Z 2012-02-06 05:18:29
现有数据如下:
部门 工号 姓名 日期 时间
安全环境监督部 574 杨业 2011/12/01 07:58
安全环境监督部 574 杨业 2011/12/01 17:31
安全环境监督部 574 杨业 2011/12/02 07:53
安全环境监督部 574 杨业 2011/12/02 07:55
安全环境监督部 574 杨业 2011/12/02 19:47
安全环境监督部 574 杨业 2011/12/04 08:07
安全环境监督部 574 杨业 2011/12/04 17:22

希望通过查询得到如下的结果:
部门 工号 姓名 日期 时间 刷卡次数
安全环境监督部 574 杨业 2011/12/01 07:58 17:31 2
安全环境监督部 574 杨业 2011/12/02 07:53 07:55 19:47 3
安全环境监督部 574 杨业 2011/12/04 08:07 17:22 2

其中关键难点在,组合时间数据串和统计当日记录数2项数据上,请高手赐教!
...全文
186 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qinglang1987 2012-02-15
  • 打赏
  • 举报
回复
select
部门,工号,姓名,时间,wm_concat(日期)
from table t
group by 部门,工号,姓名,时间
  • 打赏
  • 举报
回复
如果想要每天的日期都显示出来 可以用下表来关联你的查询表a


select b.sdate ,a.* from
(select to_char(to_date('2011-12', 'YYYY-MM') + rownum - 1, 'YYYY-MM-DD') as sdate from dual
connect by rownum <= to_number(to_char(last_day(to_date('2011-12', 'YYYY-MM')), 'dd'))) b
left jion b.sdate=a.日期
zlb_chen 2012-02-15
  • 打赏
  • 举报
回复

create table T12 as
select '安全环境监督部' d , '574' n, '杨业' m , '2011/12/01' r, '07:58' q from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/01', '17:31' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/02', '07:53' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/02', '07:55' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/02', '19:47' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/04', '08:07' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/04', '17:22' from dual;

select d ,n ,m ,r ,
replace(wm_concat(q),',',' '),
count(q)
from t12 group by d ,n ,m ,r
hubao76 2012-02-08
  • 打赏
  • 举报
回复
附上结果
1 安全环境监督部 574 杨业 2011/12/01 07:58 17:31 2
2 安全环境监督部 574 杨业 2011/12/04 08:07 17:22 2
3 安全环境监督部 574 杨业 2011/12/02 07:53 19:47 3

hubao76 2012-02-08
  • 打赏
  • 举报
回复
select t.deptid 部门号,t.empid 员工号,t.empname 姓名,t.riqi 日期,min(t.shijian)||' '||max(t.shijian) 时间,count(*) 次数
from shuaka t
group by t.deptid,t.empid,t.empname,t.riqi
qinglang1987 2012-02-08
  • 打赏
  • 举报
回复
写个函数吧
I_am_Z 2012-02-07
  • 打赏
  • 举报
回复
安全环境监督部 574 杨业 2011/12/03 0
由于发帖会自动去除制表符号,也就是在2011/12/03 和 0 之间,有一个空值的结果集,因为3号这天是没有刷卡记录的,所以,这个空值所代表的时间串,只能是空,其后,紧跟的当时刷卡次数,自然也就是零了。
I_am_Z 2012-02-07
  • 打赏
  • 举报
回复
昨天经过xpingping的开导,主体的功能,已经实现,眼下,就是我后面提到的这个间断的日期记录不好补充。
I_am_Z 2012-02-07
  • 打赏
  • 举报
回复
另外,还有个问题,就是在组合时间串的时候,希望,对相加的时间,能有个预先的排序,不知道能不能做到。
xpingping 2012-02-07
  • 打赏
  • 举报
回复
为什么是这种啊 ……
安全环境监督部 574 杨业 2011/12/03 0
如果只有红色的这种记录

如果时间是date型就没有必要转换了,我这边是字符所以to_date
with tb as
(select '安全环境监督部' d , '574' n, '杨业' m , '2011/12/01' r, '07:58' q from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/01', '17:31' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/02', '07:53' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/02', '07:55' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/02', '19:47' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/04', '08:07' from dual union all
select '安全环境监督部', '574', '杨业', '2011/12/04', '17:22' from dual )
select '安全环境监督部', '574', '杨业' ,t1.r,t2.jl,nvl(t2.rn,0)from
(select (to_date((select min(r)from tb),'YYYY/MM/DD')+rownum-1) r
from dual connect by rownum<=(select max(to_date(r,'YYYY/MM/DD'))-min(to_date(r,'YYYY/MM/DD'))from tb)+1) t1
,(select '安全环境监督部', '574', '杨业' ,r ,replace(wm_concat(q),',',' ') jl,count(q) rn
from tb group by r )t2
where t1.r=t2.r(+)
order by t1.r

你需要的结果已经实现,不会截图^-^……
kkdtfyyg 2012-02-07
  • 打赏
  • 举报
回复
如果记录有间隔,可先插入连续的记录,再进行自动填充。还有上面那个转换函数输入错误,是CAST函数,把嵌套表的列转换成行。
I_am_Z 2012-02-06
  • 打赏
  • 举报
回复
有一个环节忘了说,就是在发生日期有间断的,比如实际数据在3号这天没有任何刷卡记录,但是在最终统计的结果集中也要对3号做出体现,像下面这样显示,只不过,刷卡时间都是空白,次数是0。哎,这种sql难度真的很大,不知道有没有解决办法。

安全环境监督部 574 杨业 2011/12/01 07:58 17:31 2
安全环境监督部 574 杨业 2011/12/02 07:53 07:55 19:47 3
安全环境监督部 574 杨业 2011/12/03 0
安全环境监督部 574 杨业 2011/12/04 08:07 17:22 2
kkdtfyyg 2012-02-06
  • 打赏
  • 举报
回复
先创建一个嵌套表,把嵌套表作为另一个新表的列。然后,用以上的记录对这个表自动进行填充,把相同的日期作为一列,不同一时间作为嵌套记录。最后对这个表时行查询,用CASE把嵌套的列记录转换为行记录,再加上嵌套表中的记录数。就OK了。
  • 打赏
  • 举报
回复
SELECT 部门, 工号, 姓名, 日期, MIN(时间), COUNT(1)
FROM TBL
GROUP BY 部门, 工号, 姓名, 日期
Justina 2012-02-06
  • 打赏
  • 举报
回复
select 部门 ,工号 ,姓名 ,日期 ,
replace(wm_concat(时间),',',' '),
count(时间)
from tb group by 部门 ,工号 ,姓名 ,日期
xpingping 2012-02-06
  • 打赏
  • 举报
回复
组合时间数据串和统计当日记录数2项数据上,
select * from
(select 部门 ,工号 ,姓名 ,日期 ,
replace(wm_concat(时间),',',' '),
count(时间) rn
from tb group by 部门 ,工号 ,姓名 ,日期 )
where rn>=2
yinan9 2012-02-06
  • 打赏
  • 举报
回复
SELECT 部门, 工号, 姓名, 日期, MIN(时间), COUNT(1)
FROM TAB
GROUP BY 部门, 工号, 姓名, 日期
xpingping 2012-02-06
  • 打赏
  • 举报
回复
select 部门 ,工号 ,姓名 ,日期 ,
replace(wm_concat(时间),',',' '),
count(时间)
from tb group by 部门 ,工号 ,姓名 ,日期
我一直想找一个通用性的过狗方法,预期是这个绕过方法不会涉及到下面3个方面 (1)中间件,如iis、apache (2)数据库,如mysql、sql server (3)脚本语言,如php、aspx、asp 网上关于安全狗的sql绕过研究,大多数是fuzz绕过的帖子,fuzz方法常常使用注释绕过,涉及到数据库特性,而且广泛用于注释语法的星号(*)可能会被网站自带的防恶意代码模块拦截了,在实践中体验不好。太多fuzz过waf的文章,多数是使用注释绕过,在我看来,所有fuzz绕过,本质就是正则匹配逃逸。 我计划写一篇脚本小子最爱的,涉及知识点最少,能直接放工具里全自动跑sql注入的过狗文章。 0x01 先说说安全狗是如何判断恶意代码 安全狗、云锁、D盾等软件waf,内置一套正则匹配检测规则。这类软件waf对恶意代码的认识很有限。例如安全狗iis版,只知道要防护的服务器是iis作为中间件,并不知道要防护的服务器上面部署的数据库类型[Mysql|Sql Server|Access..]以及脚本语言类型[php|aspx|asp...]。再者,由于是依靠正则规则看恶意代码,所以对恶意代码拦截不全面。 0x02 起因 某天,在本地搭建了一个Asp+Access+IIS环境,测试安全狗Bypass 用淘气字符串就绕过了安全狗的拦截。由于只能用在某些sql语句上,具体是哪一个字符串就无足轻重了。第一次在本地环境测试安全狗就绕过了,刚好那天看到论坛在征集优秀文章,计划着写处女作投稿。 附上地址,虽然字符串数量不多,但是确实很淘气... https://github.com/minimaxir/big-list-of-naughty-strings/blob/master/blns.txt 淘气字符串 我反复提交包含sql注入的数据包,Fuzz到了字符串[removed] 只有这一处,提示数据库报错了。那么,安全狗是分析到了什么?安全狗是用正则匹配看代码的,所看到,肯定不是一大串字符。反复删减,最终出来了 ///.js 0x03 绕过测试 ///.js js可以换成rm/wm/png/jpg等静态文件后缀 测试发现,只要url包含 ///.js 就会触发内置的白名单,直接被iis版安全狗放行。既然是触发白名单,我直接把http防护策略全部开启,把防护等级调到最高来测试效果。 http://192.168.29.131:8980/sql.php?id=1 and 1=1 (拦截) http://192.168.29.131:8980/sql.php?id=1 and 1=1&safe;=///.js? (放行) http://192.168.29.131:8980/sql.php/1.js?id=1 and 1=1 (放行) 触发白名单直接放行url,顺带放行了XSS攻击代码,连xss过狗代码也不用研究了,哈哈。 http://192.168.29.131:8980/sql.php?id=1 and 1=1&xss;=[removed]alert(/xss/)[removed]&safe;=///.js? (既有sql注入,又有xss攻击,放行) http://192.168.29.131:8980/sql.php?id=1 and 1=1&xss;=[removed] (很evil,也放行) 还能在url传输什么,放行恶意代码,脑洞... 不仅是放行url,连cookie位置也放行了。 但是当恶意代码放在post数据,就绕不过安全狗。 亲测,对于安全狗iis版,php,aspx,asp均能用这种方式过狗。 http://.../sql.php?safe=///.js?&id=1 http://.../sql.aspx?safe=///.js?&id=1 http://.../sql.asp?safe=///.js?&id=1 如果是Apache版安全狗,可以试试 http://.../sql.php/1.js?id=1 http://.../sql.aspx/1.js?id=1 备注:更新了图片,最新的iis版本,亲测,本文提供的两个方法 依然有效~~~ (思考花了一个星期,认认真真写稿也就两个晚上,8号的iis版已经更新了一次,然而漏洞依然存在,看来官方人员一直都不知道) 影响范围: 针对最新的安全狗iis版,从最右边开始匹配,存在某一个问号?附近的字符串满足正则表达式 \/.*?\/.*?\/.*?\.js(其中的js可以替换成如png、jpg等静态文件后缀)例如 ///.js?或http://ip/1.jpg? 就会触发内置白名单,无论数据库和脚本语言类型。触发白名单会放行url和cookie位置的恶意代码,但依然检查post的数据。 (Apache版的规则库不一样,手工测试出精简的字符串,但是url无效访问,所以Apache版的还只能按照http://.../sql.php/1.jpg?id=1触发白名单) 0x04 搜索公开技术贴 准备写稿了,防止遇到造轮子撞车,变换关键词,搜搜互联网最近半年的公开过狗技术帖。找到了一个造轮子的博客https://www.jianshu.com/p/507439c2dd94 看图。这个造轮子方法已经很普遍出现在各种BypassWaf文章里面。 我的观点:安全狗不认识什么是php,所以这个bypass没挖掘到绕过的本质。而且有些php网站不支持PATH_INFO特性。对问题本质的理解不一样,如果是思考如何触发安全狗的正则匹配规则,就能发现这个绕过方法可以推广到aspx和asp。 虽然方法很简单,发现了如何触发内置白名单,放行恶意代码,但是无法绕过恶意代码出现在post数据的情况。美中不足,思绪一度搁浅,因为我计划写一篇“脚本小子最爱,涉及知识点最少,能直接放工具里全自动跑sql注入的过狗文章”。 0x05 峰回路转 择日再度整理思路,翻看手里的资料。再次看到上次那个造轮子博客。看到0x04造轮子三个字,我在思考什么是造轮子?一味地造轮子本身没有错,错在看不到车子,不清楚什么轮子最适合,于是就有了四方形,三角形,椭圆形的轮子,同样都是能上路的轮子。我的思维跳跃到了那个经典的fuzz造轮子代码。曾经用这个代码Fuzz一个小时的我,就觉得fuzz代码对sql语句的理解不多,出现很多没必要的测试。 手工测试sql语句的经验告诉我,所有fuzz过狗payload本质都是正则匹配逃逸(包括特殊的截断),正则匹配逃逸的核心要点绝不是/××/注释。于是对造轮子作者的payload进行测试,发现最终有用的是#a (安全狗4.0) 所以说,注释绕过的是 # 配合 \n id=1 union select 1,2,3 (拦截) id=1 union# select 1,2,3 (拦截) id=1 union#a select 1,2,3 (放行) 原理:安全狗遇到注释符号 # 就会丢弃后边代码的检测。为了提防使用回车\n绕过正则过滤,只是拦截了# ,正则规则库没考虑到#+字符串+ 的情况,造成了BypassWaf 改写了个 tamper ,命名为Bypassdog40.py (成功测试了iis版安全狗4.0和apache版安全狗4.0) 核心代码只有一条,把所有空格替换为 #a if payload: retVal = re.sub(r"\s", r"#a ", payload) 执行 sqlmap -u “http://192.168.29.131:8980/sql.php?id=1” -v 3 --random-agent --tamper=Bypassdog40.py 成功跑出所有sql注入payload 紧接着又测试注入点在post和cookie的情况,自动化注入过程很顺利。 补充:安全狗Apache3.5 规则刚好相反,拦截#a ,放行# ,命名tamper为 Bypassdog35.py 0x06总结 真理总是直接,甚至是简单的 本文包含了两个过狗方法: 一个是触发内置白名单的正则规则,能放行url和cookie的恶意代码检测,包括了xss攻击。美中不足就是绕不过post数据的恶意代码检查。 另一个Bypass方法是传统方法,提供了很简单的tamper,核心代码只有一句,可以用sqlmap跑自动化,大致可以通杀安全狗。遇到无法读数据库情况,例如拦截了INFORMATION_SCHEMA,可以配合触发内置白名单的方法,直接放行。 MySQL #单行注释 -- 单行注释(特别注意,-- 后有个空格!!!) /*多行注释*/ MS SQL Server -- 单行注释 /*多行注释*/ Oracle REM单行注释 -- 单行注释 /*多行注释*/ 新的两个tamper命名为Bypassdog400 和Bypassdog350 适用于 MS SQL Server和Oracle

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧