当前位置: 首页 > 面试题库 >

sql oracle忽略假期

丘飞
2023-03-14
问题内容

我正在使用此代码来计算忽略周末的两个日期之间的差异:

SELECT To_date(SYSDATE) - 
      To_date('01.07.2014', 'DD.MM.YYYY') 
      - 2 * ( TRUNC(Next_day(To_date(SYSDATE) - 1, 'FRI')) 
      - TRUNC( Next_day(To_date('01.07.2014' , 'DD.MM.YYYY') 
      - 1, 'FRI')) ) / 7 AS DAYS_BETWEEN
FROM dual

我还有一个名为table1的表,其中存在“日期”列(其类型为“ DATE”),其中记录了假期的所有日期。

示例表1:

DATES

12.06.2011
19.06.2014
09.05.2013
...

我正在尝试使我的代码检查该表,并且如果一个日期在上面的两个日期之间,则它在输出中为-1天。


问题答案:

如果将其划分为以下任务,则应该很容易:

  • 生成所有使用两个给定日期之间的日期 行生成 方法如图所示。
  • 忽略周末的日期,即 星期六和星期日
  • 检查 假日表中 范围内的日期是否匹配。

以下 行生成器查询 将为您 提供工作日总数 ,即 包括 星期六和星期日

SQL> WITH dates AS
  2    (SELECT to_date('01/01/2014', 'DD/MM/YYYY') date1,
  3      to_date('31/12/2014', 'DD/MM/YYYY') date2
  4    FROM dual
  5    )
  6  SELECT SUM(weekday) weekday_count
  7  FROM
  8    (SELECT
  9      CASE
 10        WHEN TO_CHAR(date1+LEVEL-1, 'DY','NLS_DATE_LANGUAGE=AMERICAN')
 11             NOT IN ('SAT', 'SUN')
 12        THEN 1
 13        ELSE 0
 14      END weekday
 15    FROM dates
 16      CONNECT BY LEVEL <= date2-date1+1
 17    )
 18  /

WEEKDAY_COUNT
-------------
          261

SQL>

现在,基于上面的行生成器查询,让我们看一个测试用例。

下面的查询将计算工作日计 2014年1月1日2014年12月31日 不包括节假日表中提到。

WITH 子句仅把它作为表,你的情况,你可以简单地使用你的 假期表

SQL> WITH dates
  2       AS (SELECT To_date('01/01/2014', 'DD/MM/YYYY') date1,
  3                  To_date('31/12/2014', 'DD/MM/YYYY') date2
  4           FROM   dual),
  5       holidays
  6       AS (SELECT To_date('12.06.2011', 'DD.MM.YYYY') holiday FROM   dual UNION ALL
  7           SELECT To_date('19.06.2014', 'DD.MM.YYYY') holiday FROM   dual UNION ALL
  8           SELECT To_date('09.05.2013', 'DD.MM.YYYY') holiday FROM   dual),
  9       count_of_weekdays
 10       AS (SELECT SUM(weekday) weekday_count
 11           FROM   (SELECT CASE
 12                            WHEN To_char(date1 + LEVEL - 1, 'DY',
 13                                 'NLS_DATE_LANGUAGE=AMERICAN')
 14                                 NOT IN (
 15                                 'SAT',
 16                                 'SUN' ) THEN 1
 17                            ELSE 0
 18                          END weekday
 19                   FROM   dates
 20                   CONNECT BY LEVEL <= date2 - date1 + 1)),
 21       count_of_holidays
 22       AS (SELECT Count(*) holiday_count
 23           FROM   holidays
 24           WHERE  holiday NOT BETWEEN To_date('01/01/2015', 'DD/MM/YYYY') AND
 25                                      To_date('31/03/2015', 'DD/MM/YYYY'))
 26  SELECT weekday_count - holiday_count as working_day_count
 27  FROM   count_of_weekdays,
 28         count_of_holidays
 29  /

WORKING_DAY_COUNT
-----------------
              258

SQL>

有总共 261个平日里 ,外面有 3个假期假期表 。因此,输出中的总工作日数为261 - 3 = 258



 类似资料:
  • 为什么如果我将这个简单的谓词赋给'func'而不是(在我的情况下总是false),我会在忽略条件时获得所有元素,而不是获得0个元素呢? 我想是因为谓词中没有考虑SettingItemModel对象,但我不确定。

  • 我已经读了几遍这方面的文档,我仍然不能完全理解这些不同命令之间的区别。也许这只是我,但是文档可以更清晰: http://git-scm.com/docs/gitignore https://help.github.com/articles/ignoring-files 此外,许多关于这一主题的评论似乎使用了“索引”、“promise”和“跟踪”这几个词,这使得这三个词之间的区别不那么明显。 我目前

  • 我有一个文件,我已在签出时标记为假设不变。大多数命令(例如,、

  • 问题内容: 我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。 我在代码的2个不同位置使用JSON序列化: 在REST API的响应中。 当代码与Elasticsearch交互时。 我在Elasticsearch中需要一些属性,但我想向应用程序用户隐藏(例如,来自关系数据库的内部ID)。 这是一个实体的例子: 问题 :当对象持久化在Elasticsearc

  • 问题内容: 我正在某个网站上插入一些标题中的换行符。假设我无法编辑源HTML,是否有CSS可以忽略这些中断的方法? 我正在移动网站的优化,所以我真的不想使用JavaScript。 问题答案: 使用css,您可以“隐藏” br标签,它们不会起作用: 如果只想在特定的标题类型中隐藏某些内容,只需使CSS更具体即可。

  • 问题内容: 这是我的实体: 这是我获得人员名单的方式: 如果我正确理解提取图,则它必须仅加载我指定的那些字段。但是,字段“ birthDate”也已加载。此外,我看到在hibernateSQL查询中选择了4列。 如何解决?我使用hibernate 5.1.0作为JPA提供程序。 问题答案: 实体图旨在控制延迟或渴望加载哪些关系(例如,一对一,一对多等)。它们可能不适用于加载各个列(取决于提供程序)