1.确定两个日期之间的工作日天数

--确定两个日期之间的工作日天数
with x0 as
(select to_date('2018-01-01','yyyy-mm-dd') as 日期 from dual
union all
select to_date('2018-01-15','yyyy-mm-dd') as 日期 from dual ),
x1 as --日期并列显示
(select min (日期) 开始日期,max(日期) 结束日期 from x0 ),
x2 as --日期之间的天数
(select 结束日期-开始日期+1 as 天数 ,开始日期,结束日期 from x1),
x3 as --构造一个从开始日期到结束日期的日期集合 (枚举日期)
(select to_char(开始日期+level-1,'DY') as 枚举日期 from x2 connect by level <=天数)
--统计日期
select sum(case when 枚举日期 in ('sat','sun')then 0 else 1 end ) as 工作日 from x3

 2.计算一年周内各日期次数

--计算一年周内各日期次数
with x0 as
(select to_date('2018-01-01','yyyy-mm-dd') as 年初 from dual ),
x1 as
(select 年初,add_months(年初,12) as 下年年初 from x0),
x2 as
(select 年初,下年年初,下年年初-年初 as 天数 from x1),
x3 as
(select 年初+level-1 as 日期 from x2 connect by level <=天数 ),
x4 as
(select 日期,to_char(日期,'DAY') AS 星期 FROM X3) SELECT 星期,count(*) from x4 group by 星期

 3.确定当前记录和下一条记录之间的相差天数

with x0 as
(select '1'as name ,to_date('2018-01-01','yyyy-mm-dd') as 日期 from dual
union all
select '2' as name,to_date('2018-01-15','yyyy-mm-dd') as 日期 from dual
union all
select '3' as name, to_date('2018-01-26','yyyy-mm-dd') as 日期 from dual ) select
name ,日期,next_d,(next_d-日期) as 相差天数
from (
select name ,日期,
lead(日期,1,null) over (order by 日期) as next_d
from x0
)

lead 函数见下文说明:(014)每日SQL学习:oracle下lag和lead分析函数

4.日期操作

select 列,行
from (
select
to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') 日期,
to_char(sysdate,'hh24') as 时,
to_char(sysdate,'mm') as 分,
to_char(sysdate,'ss') as 秒,
to_char(sysdate,'dd') as 日,
to_char(sysdate,'mm') as 月,
to_char(sysdate,'yyyy') as 年,
to_char(sysdate,'ddd') as 年内第几天,
to_char(trunc(sysdate,'day'),'yyyy-mm-dd') as 周初,
to_char(trunc(sysdate,'mm'),'yyyy-mm-dd') as 月初,
to_char(last_day(sysdate),'yyyy-mm-dd') as 月末,
to_char(add_months(trunc(sysdate,'mm'),1),'yyyy-mm-dd') as 下月初,
to_char(trunc(sysdate,'yy'),'yyyy-mm-dd') as 年初,
to_char(sysdate,'day') as 周几,
to_char(sysdate,'month') as 月份
from dual
)
unpivot( 行 for 列 in (日期,时,分,秒,日,月,年,年内第几天,周初,月初,月末,下月初,年初,周几,月份 ))

结果:

说明:注意此处last_day用法,该函数返回的时分秒和参数中的一样。既:如果参数日期为 2018-03-03 12:25:34 那么last_day(参数)结果是:2018-03-31 12:25:34

用此函数做区间条件时要小心数据被过滤了。一个月的数据最好采用add_months(trunc(sysdate,'mm'),1)为区间条件。

5.时间间隔(interval)

select
interval '50' month as "month",
interval '99' day as "day",
interval '80' hour as "hour",
interval '90' minute as "minute",
interval '3.99' second as "second",
interval '123-3' year(3) to month as "year to month"
from dual

结果:

month      day                 hour                 minute             second                        year to month
      +04-02     +99 00:00:00    +03 08:00:00    +00 01:30:00    +00 00:00:03.990000    +123-03
6.提取timestamp年月日函数(extract)

select systimestamp ,
extract(year from systimestamp) as "year",
extract(month from systimestamp) as "month",
extract(day from systimestamp) as"day",
extract(hour from systimestamp) as "hour",
extract(minute from systimestamp) as "minute",
extract(second from systimestamp) as "second"
from dual

说明:

1.extract不能提取date类型中的时分秒。

2.extract可以提取interval中的信息,而to_char()不行。

3.timestamp与date类型的区别:

1.比date类型更为精确,秒后面加了.0000

2.求日期差时 date类型的差值是天数,timestamp的差值的具体到时分秒。例如:

select to_date('2018-7-28 03:12:00','yyyy-mm-dd hh24:mi:ss')-sysdate from dual;
结果:148.422858796296
select to_timestamp('2018-7-28 03:12:00','yyyy-mm-dd hh24:mi:ss')-systimestamp from dual
结果:+000000148 10:08:54.229000000

7.周的计算

with x0 as
(select trunc(sysdate)-trunc(sysdate,'yy') as d from dual ),
x1 as
( select trunc(trunc(sysdate,'yy')+level-1) as d1 from x0 connect by level<=d)
select d1,to_char(d1,'d') as dd,
to_char(d1,'day') as 星期,
next_day(d1,1) as 下个周日,
to_char(d1,'iw')第几周
from x1

 8.确定某月的第一个和最后一个“”周内某天“的日期

select next_day(trunc(sysdate,'mm')-1,2) as 第一个星期一 ,
next_day(last_day(trunc(sysdate))-7,2) as 最后一个星期一
from dual

说明:next_day是“下一”的意思。每个星期第一天是周日,第二天才是周一。

9.创建本月日历

with x0 as
/*取出当前日期月初月末*/
(select trunc(sysdate,'mm') as first_day,last_day(trunc(sysdate,'mm')) as last_day from dual),
x1 as
/*这个月的天数*/
(select (last_day-first_day+1) as day_num ,first_day,last_day from x0 ),
x2 as
/*枚举本月每一天*/
(select first_day+level-1 as dd from x1 connect by level<=day_num),
x3 as
/*提取周信息*/
(select
to_char(dd,'iw') 第几周 ,
to_char(dd,'dd') as 日期,
to_number(to_char(dd,'d')) 周几
from x2
)
select min(case when 周几 ='2' then 日期 end ) as 周一,
max(case when 周几 ='3' then 日期 end) as 周二,
max(case when 周几 ='4' then 日期 end) as 周三,
max(case when 周几 ='5' then 日期 end) as 周四,
max(case when 周几 ='6' then 日期 end) as 周五,
max(case when 周几 ='7' then 日期 end) as 周六,
max(case when 周几 ='1' then 日期 end) as 周日
from x3 group by 第几周 order by 第几周

结果:

 10.创建本年日历

with x0 as
/*取出当前日期月初月末*/
(select trunc(sysdate,'yy') as first_day,add_months(trunc(sysdate,'yy'),12)-1 as last_day from dual),
x1 as
/*这个月的天数*/
(select (last_day-first_day+1) as day_num ,first_day,last_day from x0 ),
x2 as
/*枚举本月每一天*/
(select first_day+level-1 as dd from x1 connect by level<=day_num),
x3 as
/*提取周信息*/
(select
to_char(dd,'iw') 第几周 ,
to_char(dd,'mm') 月,
dd as 日期,
to_number(to_char(dd,'d')) 周几
from x2
),
x4 as
/*修正十二月份53周变为第一周的问题*/
( select case when 月='12' and 第几周='01' then '53' else 第几周 end 第几周,日期, 周几 from x3 )
select min(case when 周几 ='2' then 日期 end ) as 周一,
max(case when 周几 ='3' then 日期 end) as 周二,
max(case when 周几 ='4' then 日期 end) as 周三,
max(case when 周几 ='5' then 日期 end) as 周四,
max(case when 周几 ='6' then 日期 end) as 周五,
max(case when 周几 ='7' then 日期 end) as 周六,
max(case when 周几 ='1' then 日期 end) as 周日
from x4 group by 第几周 order by 第几周

11.确定指定年份季度的开始日期和结束日期

select
sn as 季度,
(sn-1)*3+1 as 月份,
add_months(to_date(年,'yyyy'),(sn-1)*3) as 开始日期,
add_months(to_date(年,'yyyy'),sn*3)-1 as 结束日期
from (select '2013' as 年,level as sn from dual connect by level<=4)

结果:

季度    月份    开始日期    结束日期
1    1    1    2013/3/1    2013/5/31
2    2    4    2013/6/1    2013/8/31
3    3    7    2013/9/1    2013/11/30
4    4    10    2013/12/1    2014/2/28

(013)每日SQL学习:日期的各种计算的更多相关文章

  1. (011)每日SQL学习:SQL开窗函数

    开窗函数:在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成.为了解决这些问题,在 2003 年 ISO SQL 标准加入了开窗函数,开窗函数的 ...

  2. (009)每日SQL学习:Oracle各个键说明(转)

    原文地址:http://www.agiledata.org/essays/keys.html 本文概述关系数据库中为表指定主键的策略.主要关注于何时使用自然键或者代理键的问题.有些人会告诉你应该总是使 ...

  3. (004)每日SQL学习:物化视图之二

    一.    物化视图概述 Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化视图存储基于远程表的数据,也可以称为快照. 物化视图可 ...

  4. (003)每日SQL学习:普通视图和物化视图

    关于这一点一直就是很懵懂的状态,今天特意网上查了一下资料,以下摘抄网上比较好的答案.以作记录. 普通视图和物化视图的区别答曰:普通视图和物化视图根本就不是一个东西,说区别都是硬拼到一起的,首先明白基本 ...

  5. (014)每日SQL学习:oracle下lag和lead分析函数

    /*语法*/ lag(exp_str,offset,defval) over() Lead(exp_str,offset,defval) over() --exp_str要取的列 --offset取偏 ...

  6. (012)每日SQL学习:TO_CHAR(DATE,FORMAT)

    SYSDATE 2009-6-16 15:25:10 TRUNC(SYSDATE) 2009-6-16 TO_CHAR(SYSDATE,'YYYYMMDD') 20090616 到日 TO_CHAR( ...

  7. (010)每日SQL学习:按字母顺序排列字符串

    需求:一串字母'ADFGH',需要按照顺序来显示:A D F G H 第一步:先把字符串拆分 with test as( select 'ADFGH' as a from dual ) select ...

  8. (008)每日SQL学习:Oracle Not Exists 及 Not In 使用

    今天遇到一个问题,not in 查询失效,我以为是穿越了,仔细查了点资料,原来理解有误! select value from temp_a a where a.id between 1 and 100 ...

  9. (007)每日SQL学习:将字符和数字分离

    with aa as ( select 'sad10' as data from dual union all select 'datf20' as data from dual union all ...

随机推荐

  1. 轻松上手CSS Grid网格布局

    今天刚好要做一个好多div格子错落组成的布局,不是田字格,不是九宫格,12个格子这样子,看起来有点复杂.关键的是笔者有点懒,要写那么多div和css真是不想下手啊.多看了两眼,这布局不跟网格挺像吗?c ...

  2. Java学习日报7.10

    package Address;import java.util.Scanner; public class Address{ Scanner sc=new Scanner(System.in); p ...

  3. 求你别再用swagger了,给你推荐几个在线文档生成神器

    前言 最近公司打算做一个openapi开放平台,让我找一款好用的在线文档生成工具,具体要求如下: 必须是开源的 能够实时生成在线文档 支持全文搜索 支持在线调试功能 界面优美 说实话,这个需求看起来简 ...

  4. java nio中,HeapByteBuffer与DirectByteBuffer的区别

    HeapByteBuffer,顾名思义,是写在jvm堆上面的一个buffer,底层的本质是一个数组,用类封装维护了很多的索引(limit/position/capacity等) DirectByteB ...

  5. Spring boot启动时报 java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long错误

    Spring boot启动时报 java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be ...

  6. WebService的开发手段

    一.WebService的开发手段 目前有关webService的开发手段有2种 1.JDK开发(jdk必须是1.6及以上版本,因为jdk是在1.6版本中引入并支持webservice开发的); 2. ...

  7. Redis核心原理-简单动态字符串SDS

    SDS简介 Redis是C语言编写的,但没有使用c语言的字符串结构,而是自己实现了一套简单动态字符串 simple dynamic string 简称SDS,SDS兼容C语言的字符串类型,原理类似Ja ...

  8. 2021升级版微服务教程5—通过IDEA运行多个项目实例「模拟集群」

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...

  9. Docker-ce Centos8 笔记一:安装Docker-ce

    Docker是一个建设企业及数据中心服务仓库的进程,通过裸金属机和虚拟机承载的MAC.windows和linux系统提供本地和远程软件服务,涉及应用软件镜像.系统镜像.虚拟化仓库(虚拟机).它承载着灵 ...

  10. 分装button组件引发的内存泄漏问题

    这个问题其实一开始在vue里写的时候并没有注意到这一点,也没有报错,直到在react里写的时候给我报了一堆错之后,经各种磨烂之后最终找到是分装button组件的问题,既然找到问题在哪就好办了 直接先上 ...