【问题标题】:case when condition to handle dates in weekdays in oracle sql在 oracle sql 中处理工作日日期的条件
【发布时间】:2021-01-26 14:09:31
【问题描述】:

我有 oracle View,我想在其中创建列 SYSTEM_INSERTED_DATE,该列在表 TUA_PTI 中不存在。

在此SYSTEM_INSERTED_DATE 列中,应设置值,例如,如果当前日期是从星期二到星期五,则应显示前一个日期,如果当天是星期一,则应显示星期五的日期。有可能吗?

以下是来自view 的 DDL:

Create View TES_RUS
(
        CLASS,
        TE_RPI
)
AS
Select 
 CLASS,
 TE_RPI
FROM TUA_PTI

【问题讨论】:

  • View 只是一个 SQL,它无法在 TUA_PTI 中插入/更新数据时捕获,如果不是,您可能必须编写触发器并在不同的表中捕获该信息能够修改表 TUA_PTI。
  • 1.使用 Oracle SQL 日期函数可以相对轻松地完成您询问的内容。 2. 但是,日期取决于您运行查询的时间。这看起来不像是真正的插入日期。 “插入的日期”应该是一个固定的日期,存储在表中,而不是计算 - 取决于运行查询的日期 - 在视图中。 3. 如果是周六或周日,你如何处理输入日期(sysdate 或其他)?如何处理“今天是星期五,昨天是星期四但它是假期,所以inserted_date 必须是前一个星期三”?
  • 例如,现在我添加了新列“SYSTEM_INSERTED_DATE”,并在 select 子句中提及为 SYSDATE-1,然后它现在默认正确地给出昨天的日期......但我们在这里不使用 oracle 日期函数识别当前日期,从这个我们可以说例如如果它是星期一,那么应该显示上星期五的日期?

标签: sql oracle date view


【解决方案1】:

假设您的输入是一个日期(任何日期),并且您必须根据该输入计算“上一个工作日”,其中“工作周”定义为周一到周五。还有额外的假设和要求:输入日期是工作日,它可能有不同于午夜的时间;输出日期必须是午夜的时间,我们不需要考虑“假期”(工作日的休息日,例如独立日)。

你可以这样做:

select trunc(input_date) - case when to_char(input_date, 'Dy') = 'Mon'
                           then 3 else 1 end
from   ...

这假设您会话的日期语言是英语(或美国或类似语言);如果不是,或者可能不会在未来或其他用户使用,您可以使用to_char 的第三个参数:

to_char(input_date, 'Dy', 'nls_date_language=English')

【讨论】:

  • 例如,现在我添加了新列“SYSTEM_INSERTED_DATE”,并在 select 子句中提及为 SYSDATE-1,然后它现在默认正确地给出昨天的日期......但我们在这里不使用 oracle 日期函数识别当前日期,从这个我们可以说例如如果它是星期一,那么应该显示上星期五的日期?
猜你喜欢
  • 2021-10-07
  • 1970-01-01
  • 2014-05-20
  • 2017-04-30
  • 2019-03-20
  • 2020-09-11
  • 2016-03-18
  • 1970-01-01
相关资源
最近更新 更多