【问题标题】:Querying the weeks for the whole month and displaying the content according to that month查询整月的周数,按月显示内容
【发布时间】:2015-02-06 04:08:50
【问题描述】:

我有一个关于我的分析编程的问题。我已经有一个查询来显示一年中的周数。但是当我需要总结有关每周发生的值时,我陷入了困境。所以这是我的 SQL 代码,

SELECT LEVEL WEEK_NUM_INCR,
       TO_CHAR (start_date + (LEVEL - 1) * 7, 'WW') WEEK_POSITION /* WEEK POSITION FOR THE WHOLE YEAR */
                                                                 ,
       TO_CHAR (start_date + (LEVEL - 1) * 7, 'DD-MM-YYYY') START_WEEK_DATE,
       TO_CHAR (start_date + (LEVEL) * 7, 'DD-MM-YYYY') END_WEEK_DATE,           
            (SELECT SUM(ONSITE_UPD_QTY) FROM DTL_ERC_UPD@WELTES_SITEMON_LINK WHERE UPD_DATE BETWEEN
                TO_CHAR (start_date + (LEVEL) * 7, 'MM/DD/YYYY') AND TO_CHAR (start_date + (LEVEL) * 7, 'MM/DD/YYYY') CONNECT BY start_date + (LEVEL - 1) * 7 < end_date)
      FROM (SELECT TO_DATE ('01/01/2015', 'MM/DD/YYYY') start_date,
                   TO_DATE ('12/31/2015', 'MM/DD/YYYY') end_date
              FROM DUAL)
CONNECT BY start_date + (LEVEL - 1) * 7 < end_date; 

它会显示星期,但是当我将这部分添加到我现在拥有的中间时,

(SELECT SUM(ONSITE_UPD_QTY) FROM DTL_ERC_UPD@WELTES_SITEMON_LINK WHERE UPD_DATE BETWEEN
                    TO_CHAR (start_date + (LEVEL) * 7, 'MM/DD/YYYY') AND TO_CHAR (start_date + (LEVEL) * 7, 'MM/DD/YYYY') CONNECT BY start_date + (LEVEL - 1) * 7 < end_date)

它会抛出这些错误, ORA-01843: 无效月份 ORA-02063: 来自 WLTES_SITEMON_LINK 的前一行

所以对于 DTL_ERC_UPD,我有

ONSITE_UPD_QTY    UPD_DATE
1                 2/5/2015 12:00:01 AM
1                 2/5/2015 12:00:01 AM
1                 2/4/2015
1                 2/4/2015
1                 2/4/2015

我希望它会在 2 月 1 日至 8 日期间显示 5,而在该行的其余部分显示 0。

请帮我解决这个问题

【问题讨论】:

  • 这是由your next question 回答的,对吧?确实是同一个问题,当您真正想作为日期进行比较时应用to_char(),这会导致隐式转换?
  • @AlexPoole 是的,但是在改进它们并为每个日期范围实现子查询时遇到问题
  • 抱歉,我不确定你的意思。通常,仅在选择列表中使用to_char 将日期转换为字符串fo display,而不是在比较 where 或 join 子句中的值时。并且只能使用to_date 将字符串转换为日期类型。如果您已经有日期,请勿将其转换为比较或操作,将其保留为日期。

标签: sql oracle date


【解决方案1】:

下面是示例表

select cast('01/08/2013' as Date) dte INTO #temp union all select
'03/01/2013' union all select
'11/01/2013' union all select
'12/01/2013' union all select
'10/21/2014' union all select
'10/27/2014' union all select
'10/30/2014' union all select
'10/31/2014' union all select
'11/01/2014' union all select
'11/02/2014' union all select
'11/04/2014' union all select
'11/05/2014' union all select
'11/08/2014' union all select
'11/09/2014' union all select
'11/11/2014' union all select
'11/20/2014' union all select
'11/07/2014' union all select
'07/11/2014' union all select
'11/13/2013' union all select
'09/01/2014' union all select
'11/03/2014' union all select
'11/18/2014' union all select
'12/05/2014' union all select
'07/24/2014' union all select
'07/26/2014' union all select
'07/27/2014' union all select
'07/28/2014' union all select
'07/29/2014' union all select
'07/30/2014' union all select
'01/01/2014' union all select
'02/01/2014' union all select
'04/01/2014' union all select
'05/01/2014' union all select
'06/01/2014' union all select
'06/01/2014' union all select
'07/01/2014' union all select
'07/01/2014' union all select
'11/05/2013' union all select
'06/16/2014' union all select
'06/17/2014' union all select
'06/18/2014' union all select
'06/19/2014' union all select
'06/20/2014' union all select
'06/21/2014' union all select
'06/22/2014' union all select
'06/23/2014' union all select
'06/24/2014' union all select
'06/25/2014' union all select
'06/26/2014' union all select
'06/27/2014' union all select
'06/28/2014' union all select
'06/29/2014'

现在您可以获得一周的开始日期和一周的结束日期

select count([Week]) cont,[Week],
DATEADD(Day,(cast(SUBSTRING([Week],5,LEN( [Week])) as integer)*7)-7,
DATEADD(year,cast(SUBSTRING([Week],1,4) as integer)-1900,0)) startDte,
DATEADD(Day,cast(SUBSTRING([Week],5,LEN( [Week])) as integer)*7,
DATEADD(year,cast(SUBSTRING([Week],1,4) as integer)-1900,0)) endDte
from (select cast(datepart(YYYY,cast(dte as DATE)) as varchar(4))+''+cast(datepart(WW,cast(dte as DATE)) as varchar(2)) [Week],dte from #temp 
 ) AS temp GROUP BY [Week]

输出是

cont    startDte              endDte

1   2013-01-08 00:00:00.000 2013-01-15 00:00:00.000
1   2013-10-29 00:00:00.000 2013-11-05 00:00:00.000
1   2013-11-05 00:00:00.000 2013-11-12 00:00:00.000
1   2013-11-12 00:00:00.000 2013-11-19 00:00:00.000
1   2013-12-03 00:00:00.000 2013-12-10 00:00:00.000
1   2013-02-26 00:00:00.000 2013-03-05 00:00:00.000
1   2014-01-01 00:00:00.000 2014-01-08 00:00:00.000
1   2014-04-02 00:00:00.000 2014-04-09 00:00:00.000
1   2014-04-30 00:00:00.000 2014-05-07 00:00:00.000
2   2014-06-04 00:00:00.000 2014-06-11 00:00:00.000
6   2014-06-18 00:00:00.000 2014-06-25 00:00:00.000
7   2014-06-25 00:00:00.000 2014-07-02 00:00:00.000
3   2014-07-02 00:00:00.000 2014-07-09 00:00:00.000
1   2014-07-09 00:00:00.000 2014-07-16 00:00:00.000
2   2014-07-23 00:00:00.000 2014-07-30 00:00:00.000
4   2014-07-30 00:00:00.000 2014-08-06 00:00:00.000
1   2014-09-03 00:00:00.000 2014-09-10 00:00:00.000
1   2014-10-22 00:00:00.000 2014-10-29 00:00:00.000
4   2014-10-29 00:00:00.000 2014-11-05 00:00:00.000
6   2014-11-05 00:00:00.000 2014-11-12 00:00:00.000
2   2014-11-12 00:00:00.000 2014-11-19 00:00:00.000
2   2014-11-19 00:00:00.000 2014-11-26 00:00:00.000
1   2014-12-03 00:00:00.000 2014-12-10 00:00:00.000
1   2014-01-29 00:00:00.000 2014-02-05 00:00:00.000

【讨论】:

  • 这对 Oracle 无效。
【解决方案2】:

您的代码中的第二个connect by 是不必要的。使用正确的join 在逻辑部分组织查询。如前所述,不要使用日期到字符的转换进行比较。以下是您可以使用的示例查询:

with period as (
  select to_date('02/01/2015', 'MM/DD/YYYY') start_date, 
      to_date('03/01/2015', 'MM/DD/YYYY') end_date from dual),
weeks as ( 
  select level week_num_inc,
    to_char(start_date + (level - 1) * 7, 'WW') week_position,
    start_date + (level - 1) * 7 start_week_date,
    start_date + level * 7 end_week_date
  from period
  connect by start_date + (level - 1) * 7 < end_date)
select week_num_inc, week_position, start_week_date, end_week_date,
    nvl(sum(dtl_erc_upd.onsite_upd_qty), 0) quantity
  from weeks w
    left join dtl_erc_upd on start_week_date <= upd_date 
      and upd_date < end_week_date
  group by week_num_inc, week_position, start_week_date, end_week_date
  order by start_week_date

result:
WEEK_NUM_INC  WEEK_POSITION  START_WEEK_DATE  END_WEEK_DATE  QUANTITY
           1  05             2015-02-01       2015-02-08            5
           2  06             2015-02-08       2015-02-15            0
           3  07             2015-02-15       2015-02-22            0
           4  08             2015-02-22       2015-03-01            0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2011-08-17
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多