如何在oracle中找到一个月内所有周的开始日期和结束日期

时间:2017-05-30 10:45:38

标签: sql oracle date

我正在尝试查找一个月内所有周的开始日期和结束日期。 目前假设我有这个

MAR-17
APR-17
MAY-17
JUN-17

我想要

Month   Week_start_date   Week_start_date

MAR-17  06-MAR-17         12-MAR-17
MAR-17  13-MAR-17         19-MAR-17
MAR-17  20-MAR-17         26-MAR-17
MAR-17  27-MAR-17         02-APR-17

APR-17  03-APR-17         09-APR-17
APR-17  10-APR-17         16-APR-17
APR-17  17-APR-17         23-APR-17
APR-17  24-APR-17         30-APR-17

MAY-17  and so on 
JUN-17

我试过了

select to_char(to_date('06-AUG-17' ), 'iw' )from dual ;

但它根据特定日期给出了week_start_date,但我想要每个月的week_start_date。 如果找到week_start_date,那么我只需添加+7即可获得week_end_date。 任何人都可以帮助我

先谢谢

2 个答案:

答案 0 :(得分:1)

试试这个。在private long GetStakeholderId() { string currentUserId = _userManager.GetUserId(User); long stakeholderId; var users = _userManager.Users; foreach (var user in users) { if (user.Email == currentUserId) { var idForStakeholder = user.Id; var stakeholders = _context.Stakeholders; foreach (var stakeholder in stakeholders) { if (stakeholder.IdentityId == idForStakeholder) { stakeholderId=stakeholder.StakeholderId; return stakeholderId; } else { return 0; } } } return 0; } } 表中添加更多月份,或将其替换为您的实际表格。 我假设m是varchar数据类型。如果没有,请在代码中将MAR-17替换为to_date(mon,'MON-YY')

mon

说明:

  • SELECT mon, TRUNC(to_date(mon,'MON-YY'), 'iw') + nxt AS iso_week_start_date , TRUNC(to_date(mon,'MON-YY'), 'iw') + 6 + nxt AS iso_week_end_date FROM (SELECT LEVEL*7 - 7 AS nxt FROM dual CONNECT BY LEVEL <=6) CROSS JOIN (SELECT 'MAR-17' AS mon FROM dual UNION ALL SELECT 'APR-17' FROM dual UNION ALL SELECT 'MAY-17' FROM dual ) m --Sample data. Replace with original table and change column mon to your `char` column. WHERE --where clause to filter out of month dates. to_date(mon,'MON-YY') <= TRUNC(to_date(mon,'MON-YY'), 'iw') + nxt --iso_week_start_date AND last_day(to_date(mon,'MON-YY')) >= TRUNC(to_date(mon,'MON-YY'), 'iw') + nxt --iso_week_start_date ORDER BY 2 返回给定日期的星期几(星期一)的第一天。

  • (选择级别* 7 - 7作为nxt从双级连接按级别&lt; = 6)它会 生成列的范围为0,7,14,21,28,35。后交叉连接它每月乘以6次,产生6个不同的星期。

  • 在第一周添加select TRUNC (sysdate, 'IW') from dual时使用此功能。

  • Where子句用于过滤days个日期。

答案 1 :(得分:0)

您可以使用以下内容:

SELECT DISTINCT day_of_month Week_start_date, day_of_month + 6 week_end_Date
FROM 
 (SELECT TRUNC (TO_DATE ('01/01/2017', 'dd/mm/yyyy'), 'Day') + 1 day_of_month
  FROM DUAL
  UNION ALL
  SELECT   TRUNC (TO_DATE ('01/01/2017', 'dd/mm/yyyy') + LEVEL,'Day')+ 1 day_of_month
  FROM DUAL
 CONNECT BY LEVEL <= 365)
ORDER BY day_of_month;

<强>解释

假设:

  • 一年中的天数为365
  • 每月的第一天是星期一

      1 SELECT DISTINCT day_of_month Week_start_date, day_of_month + 6 
        week_end_Date
      2  FROM 
      3  (SELECT TRUNC (TO_DATE ('01/01/2017', 'dd/mm/yyyy'), 'Day') + 1 day_of_month
          FROM DUAL
      4  UNION ALL
      5  SELECT   TRUNC (TO_DATE ('01/01/2017', 'dd/mm/yyyy') + LEVEL,'Day')+ 1 day_of_month
      FROM DUAL
     6 CONNECT BY LEVEL <= 365)
     7 ORDER BY day_of_month;
    

    第5-6行

    • 生成2017年1月1日至2017年12月31日期间的所有日期          年使用Connect by Level子句。

    • 对于生成的日期,使用带有'Day'fmt过滤器的TRUNC功能查找一周的第一天。

    • 由于TRUNC函数将星期日作为星期的开始,因此将其加1以获得与星期一相对应的日期。有了这个,我们将获得除2017年1月1日之外的所有日期的星期一日期。

第3行

  • 获取与2017年1月1日相对应的星期一日期

    第1行

    • 获取不同的星期一日期,并为其指定别名Week_Start_date。添加6天即可获得Week_end_Date