【问题标题】:Current status based on week number ORACLE当前状态基于周数 ORACLE
【发布时间】:2019-04-07 04:07:17
【问题描述】:

我收到此查询是为了获取从年初 (01/01/2018) 到明年年底 (31/12/2019) 的所有天数。

SELECT MYDATE,
TO_CHAR(NR_OF_SUNDAYS + 1,'FM09') WEEK_NUM,
FROM
(
SELECT MYDATE,
( (TRUNC(MYDATE,'DAY') - TRUNC(TRUNC(MYDATE,'YYYY'),'DAY')) / 7 ) +
CASE WHEN TO_CHAR(TRUNC(MYDATE,'YYYY'),'DAY') = 'SUN' THEN 1 ELSE 0 END AS NR_OF_SUNDAYS
FROM
( SELECT TRUNC (SYSDATE, 'YY') - 1 + LEVEL AS MYDATE
FROM DUAL
CONNECT BY LEVEL <= TRUNC (ADD_MONTHS (SYSDATE, 24), 'YY') -
TRUNC (SYSDATE, 'YY')
)
)

我需要一列指定以下情况:

  • 1) MYDATE
  • 2) 如果我的当前 =
  • 3) 如果我当前的一周 + 一周然后 “下周”(不包括逾期)
  • 4) 否则未来

非常感谢您的帮助。

【问题讨论】:

  • 如果您编写了所显示的查询,您应该能够轻松找到其余问题的解决方案,不是吗?你被困在哪里了?
  • MYDATE 是一个 DATE 值,您不应该将它与 CHAR 进行比较!写CASE WHEN MYDATE &lt; TRUNC(SYSDATE) THEN 'PAST DUE'

标签: sql oracle calendar oracle-sqldeveloper


【解决方案1】:

因此,在我的回答中,我尝试保留您的周数计算背后的逻辑。

但是请记住,您可以使用 oracle to_char(date,'WW')to_char(date,'IW')to_char(date,'W') 函数计算周数,然后您的生活会更轻松。

WW  Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.
W   Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh.
IW  Week of year (1-52 or 1-53) based on the ISO standard.

说了这么多,我的解决方案只使用了 sql(请注意,定义和使用函数会容易得多),基于 您的计算方法。

with date_table as (
SELECT MYDATE, to_number(TO_CHAR(NR_OF_SUNDAYS + 1,'FM09')) WEEK_NUM,  to_number(to_char(MYDATE+1,'IW')) as nu
FROM
(
SELECT MYDATE,
( (TRUNC(MYDATE,'DAY') - TRUNC(TRUNC(MYDATE,'YYYY'),'DAY')) / 7 ) +
CASE WHEN TO_CHAR(TRUNC(MYDATE,'YYYY'),'DY', 'NLS_DATE_LANGUAGE = american') = 'SUN' THEN 1 ELSE 0 END AS NR_OF_SUNDAYS
FROM
( SELECT TRUNC (SYSDATE, 'YY') - 1 + LEVEL AS MYDATE
FROM DUAL
CONNECT BY LEVEL <= TRUNC (ADD_MONTHS (SYSDATE, 24), 'YY') -TRUNC (SYSDATE,'YY')
)
)
),
todays_week as 
(
select distinct WEEK_NUM from date_table 
where trunc(sysdate)=trunc(mydate)
),
pre_final as (
select MYDATE,WEEK_NUM, (select  WEEK_NUM from todays_week) as todaysweek from date_table)
select MYDATE,sysdate,WEEK_NUM,todaysweek,
case when trunc(MYDATE) < trunc(sysdate) then 'PAST DUE' 
     when todaysweek = WEEK_NUM and abs(MYDATE-sysdate)<=7 then 'CURRENT WEEK'
     when todaysweek +1 = WEEK_NUM and abs(MYDATE-sysdate)<=14 then 'Next Week'
     else 'Future' end as description
     from pre_final;

主要思想是找到今天的周数,然后使用case when

这是我与结果的小提琴链接。 http://sqlfiddle.com/#!4/3149e4/148

编辑 1: 现在,类似的结果可以通过以下方式实现:

select res.*,
case when trunc(MYDATE) < trunc(sysdate) then 'PAST DUE' 
     when todaysweek = WEEK_NUM and abs(MYDATE-sysdate)<=7 then 'CURRENT WEEK'
     when todaysweek +1 = WEEK_NUM and abs(MYDATE-sysdate)<=14 then 'Next Week'
     else 'Future' end as description
 from (
SELECT MYDATE, to_number(to_char(MYDATE,'IW')) as WEEK_NUM,to_number(to_char(sysdate,'IW')) as todaysweek 
FROM
( SELECT TRUNC (SYSDATE, 'YY') - 1 + LEVEL AS MYDATE
FROM DUAL
CONNECT BY LEVEL <= TRUNC (ADD_MONTHS (SYSDATE, 24), 'YY') -TRUNC (SYSDATE,'YY')
)) res

【讨论】:

  • 非常感谢您的帮助。
  • @Deluq 不客气 :) 请注意,我编辑了我的答案是为了处理下一年的相同周数......否则你会得到两组 current weeknext week .
  • 是的,幸运的是,我使用这张表只是为了提前 1 个月提出计划订单。
  • TO_CHAR(TRUNC(MYDATE,'YYYY'),'DAY') 将返回 "SUNDAY " - 不是 "SUN",使用 TO_CHAR(TRUNC(MYDATE,'YYYY'),'DY', 'NLS_DATE_LANGUAGE = american') 我想知道这个查询如何提供所需的结果。
  • @WernfriedDomscheit apperanlty 这部分CASE WHEN TO_CHAR(TRUNC(MYDATE,'YYYY'),'DAY') = 'SUN' THEN 1 ELSE 0 END 始终是0 并且不参与计算。我留下了 OPs 查询,没有进一步调查。但是,既然您指出了这一点-显然您是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2014-12-03
  • 2022-01-19
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多