SQL Cookbook—数字、日期

1、计算不包含最大值和最小值的均值
2、把字母数字串转换为数值
3、更改累计和中的值–显示存款或取款后的值
4、加减日、月、年
5、计算两个日期之间的天数
6、确定两个日期之间的工作日数目
表EMP中,计算BLAKE和JONES的hiredate(聘用日期)之间的工作日数(除去星期六、星期天)
7、确定两个日期之间的月份数或年数
例如:EMP表中,求第一个员工和最后一个员工之间相差的月份数,以及这些月折合的年数
8、确定两个日期之间的秒、分、小时数
例如:EMP表中,求ALLEN和WARD的hiredate(聘用日期)之间相差的时间,分别用秒、分、小时表示
9、计算一年中周内各日期的次数
10、确定当前记录和下一条记录之间相差的天数
11、确定一年是否为闰年
12、确定一年内的天数
13、从日期中提取时间的各个部分
14、确定某个月的第一天和最后一天
15、列出当年中的所有所于星期五的日期
16、确定某月内第一个和最后一个“周内某天”的日期
例如:找出当前月的第一个星期一及最后一个星期一的日期 next_day下一个星期几
17、列出一年中每个季度的开始日期和结束日期
18、确定某个给定季度的开始日期和结束日期
19、填充丢失的日期
–为给定范围内的每个日期(每个月、周或年)生成一行信息,这样的行集通常用于生成综合报告。
–例如,计算每年内每个月聘用的员工数。检查已聘用的所有员工的聘用日期,其范围是 1980-1983
–现在,要确定1980-1983年间每个月聘用的员工数。如有哪个月没有聘用,则显示为0个
20、按照给定的时间单位进行查找
–问题:查找与给定月份、星期几或其他时间单位相匹配的日期。
–例如:找到2月份和12月份聘用的所有员工或者查找星期二聘用的所有员工
21、使用日期的特殊部分比较记录
–问题:查找聘用日期月份和周内日期都相同的员工。例如,如果在1988年3月10日星期一聘用了某了员工,
–而在2001年3月2日星期一聘用了另一个员工,那么,由于二者的聘用日期都在星期一,而且月份名一致,则可以认为他们相匹配
22、识别重叠的日期范围
–问题:查找员工在老工程结束之前就开始新工作的所有实例 当结束那天正好接了另一个项目也算
–一个开始时间在 另一行记录的开始时间和结束时间之间

1、计算不包含最大值和最小值的均值
SELECT (SUM(ID)-MAX(ID)-MIN(ID))/(COUNT(1)-2) FROM tb_dict

2、把字母数字串转换为数值
SELECT REPLACE(TRANSLATE(LOWER('adc12s3as'),
                         LOWER('abcdefghijklmnopqrstuvwxyz'),
                         RPAD('z', 24, 'z')),
               'z',
               '')
FROM DUAL

3、更改累计和中的值–显示存款或取款后的值
with tmp as (
select 1 tid,100 atm,'存款' trx from dual union all
select 2 tid,100 atm,'存款' trx from dual union all
select 3 tid,50  atm,'取款' trx from dual union all
select 4 tid,100 atm,'存款' trx from dual union all
select 5 tid,200 atm,'取款' trx from dual union all
select 6 tid,50  atm,'取款' trx from dual
)
select trx,atm,sum(decode(trx,'存款',atm,-atm)) over (order by tid) balance from tmp

4、加减日、月、年
SELECT HIREDATE,
       HIREDATE – 5 AS HD_MINUS_5D,–减日
       HIREDATE + 5 AS HD_PLUS_5D,–加日
       ADD_MONTHS(HIREDATE, -5) AS HD_MINUS_5M,–减月
       ADD_MONTHS(HIREDATE, 5) AS HD_PLUS_5M,–加月
       ADD_MONTHS(HIREDATE, -5 * 12) AS HD_MINUS_5Y,–减年
       ADD_MONTHS(HIREDATE, 5 * 12) AS HD_PLUS_5Y–加年
  FROM EMP
 WHERE DEPTNO = 10

5、计算两个日期之间的天数
SELECT to_date('2012-10-22', 'yyyy-mm-dd') – to_date('2012-9-22', 'yyyy-mm-dd') FROM dual;

6、确定两个日期之间的工作日数目
表EMP中,计算BLAKE和JONES的hiredate(聘用日期)之间的工作日数(除去星期六、星期天)
步骤:
1)、建立索引表
create table t500(
 id number(3)
)
2)、插入索引数据
declare
   v_index number(3);
begin
   for v_index in 1..500 loop
 insert into t500 values(v_index);
   end loop;
end;
3)、查询语句ss
SELECT SUM(CASE
             WHEN TO_CHAR(JONES_HIREDATE + T500.ID – 1, 'DY') IN('星期六', '星期日') THEN 0 ELSE 1
           END) AS DAYS
  FROM (SELECT MAX(CASE WHEN ENAME = 'BLAKE' THEN HIREDATE END) AS BLAKE_HIREDATE,
               MAX(CASE WHEN ENAME = 'JONES' THEN HIREDATE END) AS JONES_HIREDATE
         FROM EMP
         WHERE ENAME IN ('BLAKE', 'JONES')) X,
         T500
 WHERE T500.ID <= BLAKE_HIREDATE – JONES_HIREDATE + 1

7、确定两个日期之间的月份数或年数
例如:EMP表中,求第一个员工和最后一个员工之间相差的月份数,以及这些月折合的年数
SELECT MONTHS_BETWEEN(MAX_HIREDATE, MIN_HIREDATE),
       MONTHS_BETWEEN(MAX_HIREDATE, MIN_HIREDATE) / 12
  FROM (SELECT MIN(HIREDATE) MIN_HIREDATE, MAX(HIREDATE) MAX_HIREDATE
          FROM EMP)

8、确定两个日期之间的秒、分、小时数
例如:EMP表中,求ALLEN和WARD的hiredate(聘用日期)之间相差的时间,分别用秒、分、小时表示
select dy*24 as hr, dy*24*60 as min, dy*24*60*60 as sec
from (select (max(case when ename='WARD' then hiredate end)-max(case when ename='ALLEN' then hiredate end)) as dy from emp)

9、计算一年中周内各日期的次数
SELECT TO_CHAR(TRUNC(SYSDATE, 'y') + ROWNUM – 1, 'DY'), COUNT(*)
  FROM T500
 WHERE ROWNUM <= ADD_MONTHS(TRUNC(SYSDATE, 'y'), 12) – TRUNC(SYSDATE, 'y')
 GROUP BY TO_CHAR(TRUNC(SYSDATE, 'y') + ROWNUM – 1, 'DY')

10、确定当前记录和下一条记录之间相差的天数
SELECT ENAME, HIREDATE, NEXT_HD, NEXT_HD – HIREDATE DIFF
  FROM (SELECT DEPTNO,
               ENAME,
               HIREDATE,
               LEAD(HIREDATE) OVER(ORDER BY HIREDATE) NEXT_HD
          FROM EMP)
 WHERE DEPTNO = 10

11、确定一年是否为闰年
此处采用了最简单的方案,检查2月最后一天,如果是29,则当年就为闰年,即此处的关键是得到2月的最后一天
select to_char(last_day(add_months(trunc(sysdate, 'y'), 1)),'DD') from dual

12、确定一年内的天数
select add_months(trunc(sysdate, 'y'), 12)-trunc(sysdate, 'y') from dual

13、从日期中提取时间的各个部分
SELECT TO_CHAR(SYSDATE, 'hh24') HOUR,
       TO_CHAR(SYSDATE, 'mi') MIN,
       TO_CHAR(SYSDATE, 'ss') SEC,
       TO_CHAR(SYSDATE, 'dd') DAY,
       TO_CHAR(SYSDATE, 'mm') MONTH,
       TO_CHAR(SYSDATE, 'yyyy') YEAR
  FROM DUAL

14、确定某个月的第一天和最后一天
SELECT TRUNC(SYSDATE, 'mm') FIRSTDAY, LAST_DAY(SYSDATE) LASTDAY FROM DUAL

15、列出当年中的所有所于星期五的日期
with tmp_a as(
     –获取每一天
     select level num,trunc(sysdate,'y')+level-1 everyday from dual
            connect by level <= add_months(trunc(sysdate,'yyyy'),12)-trunc(sysdate,'y'))
select num,everyday,to_char(everyday,'day')
from tmp_a
where to_char(everyday,'day') = '星期五'

16、确定某月内第一个和最后一个“周内某天”的日期
例如:找出当前月的第一个星期一及最后一个星期一的日期 next_day下一个星期几
–方法一
with tmp_a as (
     select level num,trunc(sysdate,'mm')+level-1 everyday from dual
            connect by level <= last_day(sysdate)-trunc(sysdate,'mm')+1)
select min(everyday) 第一个星期一,
       max(everyday) 最后一个星期一 from tmp_a
where to_char(everyday,'day') = '星期一'
–方法二
select next_day(trunc(sysdate,'mm')-1,'星期一'),
       next_day(last_day(trunc(sysdate,'mm')),'星期一')-7
from dual

17、列出一年中每个季度的开始日期和结束日期
with tmp_a as(
select ddate,to_char(ddate,'q') jidu from (
select level,trunc(sysdate,'y')+level-1 ddate from dual
connect by level <= add_months(trunc(sysdate,'y'),12)-trunc(sysdate,'y'))
)select jidu 季度,min(ddate) 开始日期,max(ddate) 结束日期 from tmp_a
group by jidu

18、确定某个给定季度的开始日期和结束日期
–方法一
with tmp_a as(
select ddate,to_char(ddate,'q') jidu from (
select level,trunc(sysdate,'y')+level-1 ddate from dual
connect by level <= add_months(trunc(sysdate,'y'),12)-trunc(sysdate,'y'))
)
select min(ddate),max(ddate) from tmp_a
where jidu = '4'
–方法二
select jidu,add_months(ddate,-2) 开始日期,last_day(ddate) 结束日期 from (
select jidu,to_date(ye||lpad(mon,2,'0'),'yyyymm') ddate from (
select jidu,substr(jidu,1,4) ye,mod(jidu,10)*3 mon from (
select 20081 jidu from dual union all
select 20082 from dual union all
select 20083 from dual union all
select 20084 from dual
)))

19、填充丢失的日期
–为给定范围内的每个日期(每个月、周或年)生成一行信息,这样的行集通常用于生成综合报告。
–例如,计算每年内每个月聘用的员工数。检查已聘用的所有员工的聘用日期,其范围是 1980-1983
–现在,要确定1980-1983年间每个月聘用的员工数。如有哪个月没有聘用,则显示为0个
with tmp_a as(
select 'aa' tno,to_date('19800506','yyyymmdd') hiredate from dual union all
select 'bb' tno,to_date('19830701','yyyymmdd') hiredate from dual union all
select 'cc' tno,to_date('19860702','yyyymmdd') hiredate from dual union all
select 'dd' tno,to_date('19810510','yyyymmdd') hiredate from dual union all
select 'ee' tno,to_date('19820503','yyyymmdd') hiredate from dual union all
select 'gg' tno,to_date('19820504','yyyymmdd') hiredate from dual union all
select 'ff' tno,to_date('19821015','yyyymmdd') hiredate from dual
)
select sta,sum(cnt) cnts,count(hiredate) from (–聚合函数count()不会计算为空的列,所以不必把null转换,在下面一层就可以求出来
select sta,tno,hiredate,decode(tno,null,0,1) cnt from (
select level,add_months(trunc(min_date,'y'),level-1) sta from (
    select min(hiredate) min_date,max(hiredate) max_date from tmp_a
)
connect by level <= months_between(add_months(trunc(max_date,'y'),12),trunc(min_date,'y')) ) t
left join tmp_a on sta = trunc(hiredate,'mm')
)group by sta
order by sta

20、按照给定的时间单位进行查找
–问题:查找与给定月份、星期几或其他时间单位相匹配的日期。
–例如:找到2月份和12月份聘用的所有员工或者查找星期二聘用的所有员工
with tmp_a as(
select 'aa' tno,to_date('19800506','yyyymmdd') hiredate from dual union all
select 'bb' tno,to_date('19830701','yyyymmdd') hiredate from dual union all
select 'cc' tno,to_date('19860702','yyyymmdd') hiredate from dual union all
select 'dd' tno,to_date('19810510','yyyymmdd') hiredate from dual union all
select 'ee' tno,to_date('19820503','yyyymmdd') hiredate from dual union all
select 'gg' tno,to_date('19820504','yyyymmdd') hiredate from dual union all
select 'ff' tno,to_date('19821015','yyyymmdd') hiredate from dual
)
select tno,hiredate,to_char(hiredate,'day'),to_char(hiredate,'mm') from tmp_a
where to_char(hiredate,'day') = '星期二' or to_char(hiredate,'mm') in('07','05')

21、使用日期的特殊部分比较记录
–问题:查找聘用日期月份和周内日期都相同的员工。例如,如果在1988年3月10日星期一聘用了某了员工,
–而在2001年3月2日星期一聘用了另一个员工,那么,由于二者的聘用日期都在星期一,而且月份名一致,则可以认为他们相匹配
with tmp_a as(
select tno,hiredate,to_char(hiredate,'day') xingqi,to_char(hiredate,'mm') mon from (
select 'aa' tno,to_date('19800506','yyyymmdd') hiredate from dual union all
select 'bb' tno,to_date('19830701','yyyymmdd') hiredate from dual union all
select 'cc' tno,to_date('19860702','yyyymmdd') hiredate from dual union all
select 'dd' tno,to_date('19810510','yyyymmdd') hiredate from dual union all
select 'ee' tno,to_date('19820503','yyyymmdd') hiredate from dual union all
select 'tt' tno,to_date('20090512','yyyymmdd') hiredate from dual union all
select 'gg' tno,to_date('19820504','yyyymmdd') hiredate from dual union all
select 'ff' tno,to_date('19821015','yyyymmdd') hiredate from dual)
)
select * from tmp_a x,tmp_a y
where x.xingqi = y.xingqi and x.mon = y.mon and x.tno > y.tno

22、识别重叠的日期范围
–问题:查找员工在老工程结束之前就开始新工作的所有实例 当结束那天正好接了另一个项目也算
–一个开始时间在 另一行记录的开始时间和结束时间之间
–方法一
with tmp_a as(
select 7782 empno,'clark' ename,1 proj_id,to_date('20050616','yyyymmdd') proj_start,to_date('20050618','yyyymmdd') proj_end from dual union all
select 7782 empno,'clark' ename,4 proj_id,to_date('20050619','yyyymmdd') proj_start,to_date('20050624','yyyymmdd') proj_end from dual union all
select 7782 empno,'clark' ename,7 proj_id,to_date('20050622','yyyymmdd') proj_start,to_date('20050625','yyyymmdd') proj_end from dual union all
select 7782 empno,'clark' ename,10 proj_id,to_date('20050625','yyyymmdd') proj_start,to_date('20050628','yyyymmdd') proj_end from dual union all
select 7782 empno,'clark' ename,13 proj_id,to_date('20050628','yyyymmdd') proj_start,to_date('20050702','yyyymmdd') proj_end from dual union all
select 7839 empno,'king' ename,2 proj_id,to_date('20050617','yyyymmdd') proj_start,to_date('20050621','yyyymmdd') proj_end from dual union all
select 7839 empno,'king' ename,8 proj_id,to_date('20050623','yyyymmdd') proj_start,to_date('20050625','yyyymmdd') proj_end from dual union all
select 7839 empno,'king' ename,14 proj_id,to_date('20050629','yyyymmdd') proj_start,to_date('20050630','yyyymmdd') proj_end from dual union all
select 7839 empno,'king' ename,11 proj_id,to_date('20050626','yyyymmdd') proj_start,to_date('20050627','yyyymmdd') proj_end from dual union all
select 7839 empno,'king' ename,5 proj_id,to_date('20050620','yyyymmdd') proj_start,to_date('20050624','yyyymmdd') proj_end from dual union all
select 7934 empno,'miller' ename,3 proj_id,to_date('20050618','yyyymmdd') proj_start,to_date('20050622','yyyymmdd') proj_end from dual union all
select 7934 empno,'miller' ename,12 proj_id,to_date('20050627','yyyymmdd') proj_start,to_date('20050628','yyyymmdd') proj_end from dual union all
select 7934 empno,'miller' ename,15 proj_id,to_date('20050630','yyyymmdd') proj_start,to_date('20050703','yyyymmdd') proj_end from dual union all
select 7934 empno,'miller' ename,9 proj_id,to_date('20050624','yyyymmdd') proj_start,to_date('20050627','yyyymmdd') proj_end from dual union all
select 7934 empno,'miller' ename,6 proj_id,to_date('20050621','yyyymmdd') proj_start,to_date('20050623','yyyymmdd') proj_end from dual
)select * from tmp_a x,tmp_a y
where x.ename = y.ename and x.proj_start <= y.proj_end and x.proj_id <> y.proj_id
and x.proj_start >= y.proj_start

–方法二
–从1开始找出不连续的值 用联接 先产生一批连续的值,与所求表去联接则可
with tmp_a as(
select level base from dual
connect by level <= 100000
)select * from tmp_a x,(
select 2 num from dual union all
select 5 num from dual union all
select 6 num from dual union all
select 9 num from dual union all
select 12 num from dual
)y where x.base = y.num(+)
and y.num is null
order by x.base

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

file_table.c 文件分析 linux1_0\linux\fs\file_table.c

/** linux/fs/file_table.c** Copyright (C) 1991, 1992 Linus Torvalds*/#include <linux/fs.h> #include <linux/string.h> #include <linux/mm.h>struct file * first_file; //开头文件. int nr_files 0; //文件位置为0//文件双向链表插入文…

Day 16 包 json模块和os模块

目录 包什么是包包被导入时发生的三件事包和模块的区别相对路径和绝对路径json模块OS模块列出目录下所有文件重命名文件删除文件拼接路径判断是否为文件判断是否为文件夹判断文件是否存在新建文件夹包 什么是包 包就是里一个文件夹,里面存放了多个模块,并且包会自带__init__.py…

人的左右脑

右脑支配左手、左脚、左耳等人体的左半身神经和感觉&#xff0c;而左脑支配右半身的神经和感觉&#xff0c;正如实验一所表明的&#xff0c;右视野同左脑&#xff0c;左视野同右脑相连。因为语言中枢在左脑&#xff0c;所以左脑主要完成语言的、逻辑的、分析的、代数的思考认识…

DevExpress控件使用经验总结

DevExpress控件使用经验总结 DevExpress是一个比较有名的界面控件套件&#xff0c;提供了一系列的界面控件套件的DotNet界面控件。本文主要介绍我在使用DevExpress控件过程中&#xff0c;遇到或者发现的一些问题解决方案&#xff0c;或者也可以所示一些小的经验总结。总体来讲&…

struct task_struct 结构分析 \linux-1.0\linux\include\linux\sched.h

//任务机构体&#xff0c;大小大概1024字节 struct task_struct {/* these are hardcoded - dont touch */ //硬件代码 不可被修改volatile long state; //状态标志 /* -1 unrunnable, 0 runnable, >0 stopped */ long counter; //计数long priority; //…

mysql基础14(关于mysql数据库在没有主键情况下去除重复数据办法)

关于mysql数据库在没有主键情况下去除重复数据办法 约定 表名:mat 根据 cat 字段去重 新增加主键为 id 步骤 1、为mat新增一列自增主键 alter table mat add column id int(11) PRIMARY KEY AUTO_INCREMENT; 2、根据cat字段分组&#xff0c;找到数量大于1的&#xff0c;…

ctype.h,ctype.c 结构分析 \linux-1.0\linux\include\linux\ctype

\linux-1.0\linux\include\linux\ctype.h #ifndef _LINUX_CTYPE_H #define _LINUX_CTYPE_H#define _U 0x01 /* upper */ //大写字母 #define _L 0x02 /* lower */ //小写字母 #define _D 0x04 /* digit */ //数字 #define _C 0x08 /* cntrl */ //控制按键 #define _P 0x10 …

AaronYang WCF教程目录

原创&#xff0c;讲究实践 1. 那天有个小孩教我WCF[一][1/3] 基本搭建 阅读 2013年6月27日1:29:02 2. 那天有个小孩教我WCF[一][2/3] 基本竣工 阅读 2013年6月29日01:30:22 3. 那天有个小孩教我WCF[一][3/3] 第二种代理引用服务&#xff0c;小…

plsql中文乱码 显示问号

输入sql语句select * from V$NLS_PARAMETERS查看字符集&#xff0c;查看第一行value值是否为简体中文 解决方案&#xff1a; 新增环境变量 变量名&#xff1a; NLS_LANG 变量值: SIMPLIFIED CHINESE_CHINA.ZHS16GBK 重启PL/SQL 解决 转载于:https://www.cnblogs.com/tonyzt/p/1…

第二阶段团队绩效评分

第二阶段评分结果&#xff1a; 转载于:https://www.cnblogs.com/xczd/p/11068692.html

从最大似然到EM算法浅解(转载)

http://blog.csdn.net/zouxy09/article/details/8537620#comments转载于:https://www.cnblogs.com/zhihaowang/p/10128356.html

Shanghai Barcamp

早上起来晚了&#xff0c;晚睡晚起的习惯很不好&#xff01;总是有段时间会养成这样的不好习惯&#xff0c;过一段时间又会早睡早起。总结的说&#xff0c;去了还是有不少收获的&#xff0c;而且刚好就在前一段时间看了不少关于vc和初期投资培养方面的知识&#xff0c;结果这次…

我的虚拟机上网记录

联网时把虚拟机设置成共享IP模式就可以。如果要通过NFS链接开发板就选择桥接网络

随堂小测冲刺.第19天

我们小组的logo出来的&#xff0c;太酷了&#xff0c;不符合我的审美&#xff0c;本人表示无法接受。。。 还要谢谢李泽宇的女盆友&#xff0c;O(∩_∩)O哈哈~ 转载于:https://www.cnblogs.com/daisy99lijing/p/11024465.html

对象存储系统Swift官方文档

对象存储系统Swift技术详解&#xff1a;综述与概念 OpenStack Object Storage (Swift) 是用来创建冗余的、可扩展的对象存储&#xff08;引擎&#xff09;的开源软件。通过阅读Swift的技术文档&#xff0c;我们可以理解其中的设计的原理和实现的方法 。 Swift项目已经进展有两年…

MSBuild编译扩展

新增一个C#工程&#xff0c;用记事本打开工程文件&#xff08;.csproj结尾&#xff09;&#xff0c;滚动条拉到最后&#xff0c;大家可以看到一段如下的代码&#xff0c;其中<Target Name"BeforeBuild">和<Target Name"AfterBuild">大家根据名…

电影bt

电影&#xff1a; http://www.bttiantang.com/

修改2440里面的FriendlyARM

修改2440里面的FriendlyARM 在/etc/init.d文件夹里面有一个rcS文件&#xff0c;修改/bin/hostname FriendlyARM中的FriendlyARM即可 比如修改为/bin/hostname Solar posted on 2011-12-07 17:22 Neddy11 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/Neddy…

vs2008 下编译jrtplib-3.9.0成功

网址:http://blog.csdn.net/jid_223/article/details/6858663 jrtplib-3.9.0的编译&#xff0c;终于搞通了。网上搜集了很多资料&#xff0c;自己也调试了很久。 首先&#xff0c;jrtplib-3.9.0是什么不用多说吧&#xff0c;它是一个很牛的老外用C写的一个开源的RTP协议库&…

Eclipse安装VJET报错解决办法

2019独角兽企业重金招聘Python工程师标准>>> Eclipse在安装JS编辑器插件VJET时可能会出现以下错误 Cannot complete the install because one or more required items could not be found. Software being installed: VJET Java Based Dom Kit (Incubation) 0.10.0…