【问题标题】:Using Case Statement in Where Clause ___ Using date ranges with BETWEEN在 Where 子句中使用 Case 语句 ___ 将日期范围与 BETWEEN 一起使用
【发布时间】:2020-03-20 21:11:55
【问题描述】:

我正在尝试根据我们是否已经过了当月的第一个工作日,将日期过滤到特定范围。

Oracle 似乎不喜欢我使用BETWEEN

WHEN   
TO_DATE(myDate,'YYYYMMDD')=CASE WHEN TO_DATE(SYSDATE-1) - TO_DATE(last_day(add_months(sysdate, -1))+6)>0 
THEN  
TO_DATE(last_day(add_months(sysdate, -1))+1, 'YYYYMMDD') --AND to_date(TRUNC(SYSDATE) - 1, 'YYYYMMDD')
Else   
TO_DATE(last_day(add_months(sysdate, -2))+1, 'YYYYMMDD') --AND to_date(TRUNC(SYSDATE) - 1, 'YYYYMMDD')
END

请告诉我如何纠正这个问题。

【问题讨论】:

  • sysdate返回一个DATE值,请不要使用TO_DATE(SYSDATE-1)
  • 并且日期应该存储为日期。 myDate 是必须转换为日期的字符串吗?希望不会。 TO_DATE(myDate,'YYYYMMDD') 应该只是 myDate 或者如果您想删除时间部分:TRUNC(myDate)

标签: sql oracle date case where-clause


【解决方案1】:

如果您希望日期等于或在当月的第一个星期一之后,您可以这样做:

to_date(my_date, 'YYYYMMDD') >= next_day(trunc(sysdate, 'MM') - 1, 'MONDAY')

trunc(sysdate, 'MM') - 1 为您提供上个月的最后一天。然后next_day(..., 'MONDAY') 给你下一个星期一。

您可以根据您对工作日的定义更改日期名称。此外,值得注意的是日期名称(next_day() 的第二个参数必须以会话的语言提供。

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 2021-03-14
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多