使用oracle sql生成一年日期

qvk1mo1f  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(458)

我有一个表,有三个id和日期,我想从当前日期生成一年的日期,在六个月之前和之后,然后我想在这一年生成的日历上绘制三个日期

  1. SELECT (TO_DATE(SYSDATE)-180) + ROWNUM DT
  2. FROM (SELECT 1
  3. FROM DUAL
  4. CONNECT BY LEVEL <=180)
vd8tlhqk

vd8tlhqk1#

“月”的概念是可变的,所以你可能需要再次检查“6个月”是否真的是你想要的。如果你不知道日期数学的奇怪之处,它会产生意想不到的结果。
也就是说,在当前日期的两边都包含6个月的日历可以用以下公式生成。请注意,184天是6个月(7月至12月)所能持续的最长时间。

  1. SELECT dt
  2. FROM (SELECT TRUNC(SYSDATE - 184) + LEVEL AS dt
  3. FROM dual
  4. CONNECT BY LEVEL <= 369)
  5. WHERE dt BETWEEN add_months(TRUNC(SYSDATE), -6) AND add_months(TRUNC(SYSDATE), 6);
drkbr07n

drkbr07n2#

照你说的做:有一个表有3个ID和它们的日期,你想绘制日历。
使用分层查询,日期生成为

  1. SQL> with
  2. 2 threeid (id, datum) as
  3. 3 (select 1, date '2020-05-29' from dual union all
  4. 4 select 2, date '2020-01-01' from dual union all
  5. 5 select 3, date '2020-02-29' from dual
  6. 6 ),
  7. 7 cal as
  8. 8 (select add_months(datum, -6) + column_value - 1 datum
  9. 9 from threeid cross join
  10. 10 table(cast(multiset(select level from dual
  11. 11 connect by level <= add_months(datum, 6) - add_months(datum, -6)
  12. 12 ) as sys.odcinumberlist))
  13. 13 where id = 1 --> for the 1st ID; change that for other calendars
  14. 14 )
  15. 15 select * from cal order by datum;
  16. DATUM
  17. ----------
  18. 29.11.2019
  19. 30.11.2019
  20. 01.12.2019
  21. 02.12.2019
  22. 03.12.2019
  23. <snip>
  24. 25.11.2020
  25. 26.11.2020
  26. 27.11.2020
  27. 28.11.2020
  28. 366 rows selected.

如果你想画出来,用这个代替15号线。。。

  1. <snip>
  2. 15 select lpad(month, 20, ' ') month,
  3. 16 "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
  4. 17 from (select to_char(dt, 'fmMonthfm YYYY') month,
  5. 18 week,
  6. 19 max(decode(to_char(dt, 'd'), '1', lpad(to_char(dt, 'fmdd'), 2))) "Mon",
  7. 20 max(decode(to_char(dt, 'd'), '2', lpad(to_char(dt, 'fmdd'), 2))) "Tue",
  8. 21 max(decode(to_char(dt, 'd'), '3', lpad(to_char(dt, 'fmdd'), 2))) "Wed",
  9. 22 max(decode(to_char(dt, 'd'), '4', lpad(to_char(dt, 'fmdd'), 2))) "Thu",
  10. 23 max(decode(to_char(dt, 'd'), '5', lpad(to_char(dt, 'fmdd'), 2))) "Fri",
  11. 24 max(decode(to_char(dt, 'd'), '6', lpad(to_char(dt, 'fmdd'), 2))) "Sat",
  12. 25 max(decode(to_char(dt, 'd'), '7', lpad(to_char(dt, 'fmdd'), 2))) "Sun"
  13. 26 from ( select dt,
  14. 27 case when dt >= to_date(to_char(dt, 'dd/') ||'12/'||
  15. 28 to_char(sysdate,'yyyy'), 'dd/mm/yyyy')
  16. 29 and wk = '01'
  17. 30 then '53'
  18. 31 else wk
  19. 32 end week
  20. 33 from (select datum dt, to_char(datum, 'iw') wk
  21. 34 from cal
  22. 35 )
  23. 36 )
  24. 37 group by to_char(dt, 'fmMonthfm YYYY'), week
  25. 38 )
  26. 39 order by to_date( month, 'Month YYYY' ), to_number(week);

... 然后得到:

  1. MONTH Mon Tue Wed Thu Fri Sat Sun
  2. -------------------- -------- -------- -------- -------- -------- -------- --------
  3. November 2019 29 30
  4. December 2019 30 31
  5. December 2019 1
  6. December 2019 2 3 4 5 6 7 8
  7. December 2019 9 10 11 12 13 14 15
  8. December 2019 16 17 18 19 20 21 22
  9. December 2019 23 24 25 26 27 28 29
  10. January 2020 1 2 3 4 5
  11. January 2020 6 7 8 9 10 11 12
  12. January 2020 13 14 15 16 17 18 19
  13. January 2020 20 21 22 23 24 25 26
  14. January 2020 27 28 29 30 31
  15. February 2020 1 2
  16. February 2020 3 4 5 6 7 8 9
  17. February 2020 10 11 12 13 14 15 16
  18. February 2020 17 18 19 20 21 22 23
  19. February 2020 24 25 26 27 28 29
  20. March 2020 1
  21. March 2020 2 3 4 5 6 7 8
  22. March 2020 9 10 11 12 13 14 15
  23. March 2020 16 17 18 19 20 21 22
  24. March 2020 23 24 25 26 27 28 29
  25. March 2020 30 31
  26. April 2020 1 2 3 4 5
  27. April 2020 6 7 8 9 10 11 12
  28. April 2020 13 14 15 16 17 18 19
  29. April 2020 20 21 22 23 24 25 26
  30. April 2020 27 28 29 30
  31. May 2020 1 2 3
  32. May 2020 4 5 6 7 8 9 10
  33. May 2020 11 12 13 14 15 16 17
  34. May 2020 18 19 20 21 22 23 24
  35. May 2020 25 26 27 28 29 30 31
  36. June 2020 1 2 3 4 5 6 7
  37. June 2020 8 9 10 11 12 13 14
  38. June 2020 15 16 17 18 19 20 21
  39. June 2020 22 23 24 25 26 27 28
  40. June 2020 29 30
  41. July 2020 1 2 3 4 5
  42. July 2020 6 7 8 9 10 11 12
  43. July 2020 13 14 15 16 17 18 19
  44. July 2020 20 21 22 23 24 25 26
  45. July 2020 27 28 29 30 31
  46. August 2020 1 2
  47. August 2020 3 4 5 6 7 8 9
  48. August 2020 10 11 12 13 14 15 16
  49. August 2020 17 18 19 20 21 22 23
  50. August 2020 24 25 26 27 28 29 30
  51. August 2020 31
  52. September 2020 1 2 3 4 5 6
  53. September 2020 7 8 9 10 11 12 13
  54. September 2020 14 15 16 17 18 19 20
  55. September 2020 21 22 23 24 25 26 27
  56. September 2020 28 29 30
  57. October 2020 1 2 3 4
  58. October 2020 5 6 7 8 9 10 11
  59. October 2020 12 13 14 15 16 17 18
  60. October 2020 19 20 21 22 23 24 25
  61. October 2020 26 27 28 29 30 31
  62. November 2020 1
  63. November 2020 2 3 4 5 6 7 8
  64. November 2020 9 10 11 12 13 14 15
  65. November 2020 16 17 18 19 20 21 22
  66. November 2020 23 24 25 26 27 28
  67. 64 rows selected.
  68. SQL>

(这个不错的日历查询最初(至少,我认为是这样)发布在orafaq网站上;我调整了它,希望它能正确显示日期)

展开查看全部

相关问题