oracle怎么计算两个日期之间去除周末的天数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle怎么计算两个日期之间去除周末的天数?相关的知识,希望对你有一定的参考价值。

我有一张表有个日期字段,现在想计算当前系统时间减去该日期字段所得的工作天数,去除周六周日的,该怎么写?不要存储过程的,先谢谢各位~~

    适用于SQL上下文环境

    去掉的是周六/7,周日/1两天周末

    具体SQL如下、这是避免日期格式本地化的版本

select count(1) from (
  select to_char(TO_DATE('2016-12-24','yyyy-MM-dd') - level, 'd') DOW
  from dual
connect by level <= trunc(TO_DATE('2016-12-24','yyyy-MM-dd') - TO_DATE('2016-11-19','yyyy-MM-dd'))
) where DOW not in (7, 1);

总结:

第一层查询是通过connect by level生成两个日期间的天数行

其中to_char(,'d')DOW字段返回的是周几的对应1~7的数字

第二层查询就是去掉周六周日然后count天数

参考技术A 1、获取当天是礼拜几:select to_char(sysdate,'d') from dual; --礼拜天为1,礼拜一为2,类推
2、获取 两个时间段间的 工作日:
select (trunc(&end_dt - &start_dt) -
((case
WHEN (8 - to_number(to_char(&start_dt,'D'))) > trunc(&end_dt - &start_dt) + 1 THEN 0
ELSE
trunc((trunc(&end_dt - &start_dt) -
(8 - to_number(to_char(&start_dt,'D'))))/7) + 1 END) +
(case
WHEN mod(8 - to_char(&start_dt, 'D'), 7) > trunc(&end_dt - &start_dt) - 1 THEN 0
ELSE
trunc((trunc(&end_dt - &start_dt) - (mod(8 - to_char(&start_dt,'D'),7) + 1))/7) + 1 END)))
as workingdays
from dual
下面的sql可以直接运行:
select (trunc(to_date('2010-11-11','yyyy-mm-dd') - to_date('2010-11-07','yyyy-mm-dd')) -
((case
WHEN (8 - to_number(to_char(to_date('2010-11-07','yyyy-mm-dd'),'D'))) > trunc(to_date('2010-11-11','yyyy-mm-dd') - to_date('2010-11-07','yyyy-mm-dd')) + 1 THEN 0
ELSE
trunc((trunc(to_date('2010-11-11','yyyy-mm-dd') - to_date('2010-11-07','yyyy-mm-dd')) -
(8 - to_number(to_char(to_date('2010-11-07','yyyy-mm-dd'),'D'))))/7) + 1 END) +
(case
WHEN mod(8 - to_char(to_date('2010-11-07','yyyy-mm-dd'), 'D'), 7) > trunc(to_date('2010-11-11','yyyy-mm-dd') - to_date('2010-11-07','yyyy-mm-dd')) - 1 THEN 0
ELSE
trunc((trunc(to_date('2010-11-11','yyyy-mm-dd') - to_date('2010-11-07','yyyy-mm-dd')) - (mod(8 - to_char(to_date('2010-11-07','yyyy-mm-dd'),'D'),7) + 1))/7) + 1 END)))
as workingdays
from dual
参考技术B select count(*) from table_a where to_char(date,'day') not in('星期六','星期天')
或者
select count(*) from table_a where to_char(date,'d') not in('1','7')
参考技术C select count(1)
from (select to_char(sysdate - level, 'day') dayofweek
from dual
connect by level <=
(select trunc(sysdate - to_date('&date', 'yyyy-MM-dd'))
from dual))
where dayofweek not in ('星期六', '星期日')追问

兄弟,你这个我运行完了没有去掉周六周日啊?

追答

真是小白,应该是语言环境问题,你先看select to_char(sysdate, 'day') from dual这个的运行结果

追问

这个运行完了就是英文的星期二啊,我按你上面的那个运行后,我库里的是6月10号结果返回的就是4天,没去掉周六周日啊。我把你的中文星期六星期日改成英文了,还是不行

追答

你确定?看来我的是山寨的oracle

追问

额。。。肿么会酱。。。

我这运行结果这样的。。。

我用别人的电脑试了,你的语句确实好使,但在我电脑上有问题。。。看来是我的oracle是山寨的。。。谢谢啦~~~

本回答被提问者和网友采纳
参考技术D select count(1)
from (select to_char(hiredate - level, 'day') dayofweek
from emp connect by level <=
(select trunc(hiredate - to_date('&date', 'yyyy-MM-dd'))
from dual))
where dayofweek not in ('星期六', '星期日')

java中计算两个日期之间差的天数

参考技术A 分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:

比如两个日期:2005-12-31和2006-01-05,怎么才能精确的计算出这两个日期之间差的天数?

望回答的详细一些,谢了先.

解析:

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

class Test2

public static String getDate()

SimpleDateFormat ft = new SimpleDateFormat("yyyy/MM/dd");

Date dd = new Date();

return ft.format(dd);



public static long getQuot(String time1, String time2)

long quot = 0;

SimpleDateFormat ft = new SimpleDateFormat("yyyy/MM/dd");

try

Date date1 = ft.parse( time1 );

Date date2 = ft.parse( time2 );

quot = date1.getTime() - date2.getTime();

quot = quot / 1000 / 60 / 60 / 24;

catch (ParseException e)

e.printStackTrace();



return quot;



public static void main(String[] args) throws Exception

String date1 = "2008/8/8";

String date2 = getDate();

long day = getQuot(date1,date2);

System.out.println( "距离 "+date1+" 还有 "+day+" 天" );





你看一下这段代码,是从今天到2008/8/8的天数。

Date的getTime()方法返回自1970年1月1日午夜(通用时间)以来的毫秒数。

用2008/8/8的getTime()减去今天的getTime()就是这两天相差的毫秒数,1秒=1000毫秒,1分钟=60秒,1小时=60分钟,1天=24小时,然后除除除就得到天数了。

以上是关于oracle怎么计算两个日期之间去除周末的天数?的主要内容,如果未能解决你的问题,请参考以下文章

计算没有周末的2个日期之间的天数[重复]

oracle把查两个日期相减的天数变成数字类型

获取两个日期之间的天数,不包括周末

android里 怎么计算日期差

oracle 日期计算

如何在 oracle sql 中提取两个日期之间的天数?