首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从date列提取2天数据,不包括plsql中的周末。

从date列提取2天数据,不包括plsql中的周末。
EN

Stack Overflow用户
提问于 2022-11-14 04:08:11
回答 2查看 52关注 0票数 0

查找PL/SQL查询中的帮助。

商业案例:

从日期栏中提取前2天的数据,周末除外。

代码语言:javascript
运行
复制
select * from holddbo.pos where eff_date = '15-NOV-2022'

  1. 在15-11-2022,我正在查找14-11和11-11不包括14-11-2022的周末
  2. 的数据,我正在查找11-11和10-11不包括11-11-2022的周末
  3. 的数据,我正在查找10-11和09-11不包括

的数据。

EN

回答 2

Stack Overflow用户

发布于 2022-11-14 10:02:54

也许这能回答你的问题:

代码语言:javascript
运行
复制
WITH 
    tbl (A_DATE, A_VALUE) AS 
    (
        Select TRUNC(SYSDATE) - 15 + LEVEL , 300 + LEVEL 
        From DUAL 
        Connect By LEVEL <= 14
    ),
  grid AS
      (
          SELECT 
              A_DATE, A_VALUE,
              To_Char(A_DATE, 'd') "DAY_NUM_OF_WEEK",
              To_Char(A_DATE, 'DY') "DAY_OF_WEEK",
              CASE 
                  WHEN To_Char(A_DATE, 'DY') IN('MON', 'TUE') THEN A_DATE - 4
              ELSE
                A_DATE - 2
              END "DAY_1",
              CASE 
                  WHEN To_Char(A_DATE, 'DY') = 'MON' THEN A_DATE - 3
              ELSE
                A_DATE - 1
              END "DAY_2"
          FROM
              tbl
          ORDER BY
              A_DATE
      )
Select
    *
From
    grid
Where 
    A_DATE = (Select DAY_1 From grid Where A_DATE = :Effective_Date)
  OR
    A_DATE = (Select DAY_2 From grid Where A_DATE = :Effective_Date)
    
    
/*  
Result for :Effective_Date = '07-NOV-22' (MON)
A_DATE       A_VALUE DAY_OF_WEEK
--------- ---------- -----------
03-NOV-22        304 THU         
04-NOV-22        305 FRI        


Result for :Effective_Date = '08-NOV-22' (TUE)
A_DATE       A_VALUE DAY_OF_WEEK
--------- ---------- -----------
04-NOV-22        305 FRI         
07-NOV-22        308 MON       


Result for :Effective_Date = '09-NOV-22' (WED)
A_DATE       A_VALUE DAY_OF_WEEK
--------- ---------- -----------
07-NOV-22        308 MON         
08-NOV-22        309 TUE        
*/

with子句(tbl)只生成一些要处理的示例数据。

在这里,创建一个名为DAY_1和DAY_2的网格,以根据问题中的规则附加DAY_2和日期。通过这种方式,可以在主SQL中对数据进行筛选。

注意:周日我没有处理:Effective_Day,以防你说周末被排除了--如果需要的话,你可以这样做。无论如何,星期六都会很好。

问候..。

加法

在评论之后..。

代码语言:javascript
运行
复制
SELECT 
              A_DATE,
              To_Char(A_DATE, 'd') "DAY_NUM_OF_WEEK",
              To_Char(A_DATE, 'DY') "DAY_OF_WEEK",
              CASE 
                  WHEN To_Char(A_DATE, 'DY') IN('MON', 'TUE') THEN A_DATE - 4
              ELSE
                A_DATE - 2
              END "DAY_1",
              CASE 
                  WHEN To_Char(A_DATE, 'DY') = 'MON' THEN A_DATE - 3
              ELSE
                A_DATE - 1
              END "DAY_2"
          FROM
              dual
          ORDER BY
              A_DATE

如果您只想获得从给定日期开始的天数,请使用上面的查询将您的日期放在一起,而不是A_DATE。它将给出以下结果:

代码语言:javascript
运行
复制
--  For A_DATE = '15-NOV-22'
--  A_DATE    DAY_NUM_OF_WEEK DAY_OF_WEEK DAY_1     DAY_2   
--  --------- --------------- ----------- --------- ---------
--  15-NOV-22 2               TUE         11-NOV-22 14-NOV-22
--  
--  For A_DATE = '10-NOV-22'
--  A_DATE    DAY_NUM_OF_WEEK DAY_OF_WEEK DAY_1     DAY_2   
--  --------- --------------- ----------- --------- ---------
--  10-NOV-22 4               THU         08-NOV-22 09-NOV-22

用你的分贝

代码语言:javascript
运行
复制
SELECT 
    CASE 
        WHEN To_Char(Your_Date_Column, 'DY') IN('MON', 'TUE') THEN Your_Date_Column - 4
    ELSE
      Your_Date_Column - 2
    END "DAY_1",
    CASE 
        WHEN To_Char(Your_Date_Column, 'DY') = 'MON' THEN Your_Date_Column - 3
    ELSE
      Your_Date_Column - 1
    END "DAY_2"
FROM
    Your_Table
ORDER BY
    Your_Date_Column

..。或者你可以用双选择加入你的桌子来获得你的日子。

..。或在选择列表和/或where子句中从dual选择天数

..。任何适合你的方式

问候..。

如果您更新的问题意味着它的外观-以下是您更新的解决方案:

代码语言:javascript
运行
复制
select 
    * 
from 
    holddbo.pos 
Where
  eff_date = CASE WHEN To_Char(A_DATE, 'DY') IN('MON', 'TUE') THEN A_DATE - 4 ELSE A_DATE - 2 END  --DAY_1
  OR
  eff_date = CASE WHEN To_Char(A_DATE, 'DY') = 'MON' THEN A_DATE - 3 ELSE A_DATE - 1 END;   --DAY_2

只要把你的约会日期(‘15-11月-2022年“)代替A_DATE

票数 0
EN

Stack Overflow用户

发布于 2022-11-16 02:37:06

谢谢@d我做了几个加法,所以不用在多个地方更改日期

代码语言:javascript
运行
复制
WITH cteData AS (SELECT TO_DATE('20220107', 'YYYYMMDD') AS BUSINESS_DATE FROM DUAL)
select * from holddbo.pos p 
CROSS JOIN 
cteData d
Where
  p.effective_date = CASE WHEN To_Char(BUSINESS_DATE, 'DY') IN('MON', 'TUE') THEN BUSINESS_DATE - 4 ELSE BUSINESS_DATE - 2 END  --DAY_1
  OR
  p.effective_date = CASE WHEN To_Char(BUSINESS_DATE, 'DY') = 'MON' THEN BUSINESS_DATE - 3 ELSE BUSINESS_DATE - 1 END   --DAY_2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74426831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档