【问题标题】:ORACLE Find Date ('DD-MON-YYYY') of a given weekday in the past 7 daysORACLE 查找过去 7 天内给定工作日的日期 ('DD-MON-YYYY')
【发布时间】:2017-08-11 22:58:58
【问题描述】:

我正在尝试创建一个视图,该视图比较具有 ('Daily'、'Wednesday'、'Tuesday' 等值的 SCHEDULE 表和另一个每天更新的表 (REPORT CREATED)日期(2017 年 8 月 11 日)。基本上,如果 Schedule 表显示 Daily,则 Report Created 表记录值应该是 sysdate(当前日期)等于的值。也就是说,我不确定如何找出最近的“星期三”或“星期二”等于什么。我确实找到了 SQL server (How to get Saturday's Date (Or any other weekday's Date)- SQL Server) 的函数;但是,我不明白它是如何工作的,并且在 Oracle 中找不到等价物。任何指导将不胜感激!

编辑:我创建了两个示例表:

日程表:

Report_Name | Frequency
ORDERS_BY_DEPT | Daily
LOW_STOCK | Wednesday
INVENTORY_DISC | Thursday

和报告表:

Report_Name | Create_Dt
INVENTORY_DISC | 3-Aug-2017
LOW_STOCK | 9-Aug-2017
ORDERS_BY_DEPT | 10-Aug-2017

基本上,Inventory_Disc 报告已关闭,因为它本应在每个星期四运行,但自上周四以来未更新,Orders_By_Dept 报告已关闭,因为它是每日报告且今天未运行。

【问题讨论】:

  • 过滤过去 7 天,并使用 weekdays 的连接表达式...
  • 请提供minimal reproducible example - 表格数据、预期输出等
  • 你能添加一个示例数据吗

标签: sql oracle


【解决方案1】:

使用NEXT_DAY( date_value, day_string ) 函数。取当天 (SYSDATE) 并从中减去 7 天,然后找到与您所需的星期几匹配的第二天。

所以,要获取最近的星期三:

SELECT NEXT_DAY( TRUNC( SYSDATE ) - 7, 'WEDNESDAY' )
FROM DUAL

【讨论】:

  • 这是一个更好的方法:)
  • @MT0 感谢您的回复。我相信这绝对是前进的方向。也就是说,当我这样做时,我收到一个错误。我的 SQL 是:SELECT a.report_name, CASE a.frequency WHEN 'Daily' THEN TRUNC(SYSDATE) ELSE NEXT_DAY(SYSDATE - 7, a.frequency) END expected_dt, b.create_dt from schedule a LEFT OUTER JOIN reports b on (A .report_name = b.report_name);当我运行它时,我得到错误:ORA-00932,不一致的数据类型:预期的 CHAR 得到 DATE 并且行/列指向 NEXT_DAY 函数中的 a.frequency。
  • 也就是说,a.frequency 列是 varchar2,所以我不确定它是如何被识别为日期的
【解决方案2】:

您可以通过以下方式找到day of the week

to_char(sysdate, 'D')

例如,最后一个星期四是:

select  case 
        when to_char(sysdate, 'D') < 4 then sysdate - to_char(sysdate, 'D') - 7 + 4
        else sysdate - to_char(sysdate, 'D') + 4
        end
from    dual

【讨论】:

  • TO_CHAR( date, 'D' ) 取决于 NLS_TERRITORY 设置,并且会根据运行的位置给出不同的结果。 ALTER SESSION SET NLS_TERRITORY='AMERICA'; SELECT TO_CHAR( DATE '2017-08-11', 'D' ) FROM DUAL; 输出 6 但如果你这样做 ALTER SESSION SET NLS_TERRITORY='UNITED KINGDOM'; 然后它输出 5。如果今天是星期一并且您想要上一个星期二,您也会遇到问题,因为您需要回到上一周。
  • @MT0:同意,它需要当地的日期编号(美国的星期四是 5)。 case 应该正确处理上周。 next_day() 虽然是更好的选择
猜你喜欢
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2019-02-28
相关资源
最近更新 更多