在Oracle和MySQL中利用SQL查询出今年日历

Oracle写法:

select case
         when rank() over(partition by month order by week) = 1 then
          month
         else
          ' '
       end month,
       max(一) 一,
       max(二) 二,
       max(三) 三,
       max(四) 四,
       max(五) 五,
       max(六) 六,
       max(日) 日
  from (select to_char(start_day + i, 'iw') week,
               to_number(to_char(start_day + i, 'mm')) || '月' month,
               case
                 when to_char(start_day + i, 'd') = c.一 then
                  to_char(start_day + i, 'dd')
               end 一,
               case
                 when to_char(start_day + i, 'd') = c.二 then
                  to_char(start_day + i, 'dd')
               end 二,
               case
                 when to_char(start_day + i, 'd') = c.三 then
                  to_char(start_day + i, 'dd')
               end 三,
               case
                 when to_char(start_day + i, 'd') = c.四 then
                  to_char(start_day + i, 'dd')
               end 四,
               case
                 when to_char(start_day + i, 'd') = c.五 then
                  to_char(start_day + i, 'dd')
               end 五,
               case
                 when to_char(start_day + i, 'd') = c.六 then
                  to_char(start_day + i, 'dd')
               end 六,
               case
                 when to_char(start_day + i, 'd') = c.日 then
                  to_char(start_day + i, 'dd')
               end 日
          from (select last_day(add_months(trunc(sysdate),-to_number(to_char(sysdate,'mm')))) start_day
                  from dual) a,
               (select rownum i from xmltable('1 to 1000')) b,
               (select '2' 一, '3' 二, '4' 三, '5' 四, '6' 五, '7' 六, '1' 日
                  from dual) c
         where start_day + i < add_months(last_day(add_months(trunc(sysdate),-to_number(to_char(sysdate,'mm')))),12))
 group by week, month
 order by week;

想不想成为SQL大神?想不想精通SQL优化,精通所有关系型数据库优化?
加我微信692162374 报名单独辅导 , 顺带我还可以教你Python,Oracle,MySQL,以及大数据
 

ORACLE

MySQL写法:

select case
         when row_number() over(partition by month order by date) = 1 then
          concat(month + 0, '月')
       end month,
       max(一) 一,
       max(二) 二,
       max(三) 三,
       max(四) 四,
       max(五) 五,
       max(六) 六,
       max(日) 日
  from (select date,
               week(date, 1) wk,
               date_format(date, '%m') month,
               case
                 when date_format(date, '%w') = 1 then
                  date_format(date, '%d')
               end 一,
               case
                 when date_format(date, '%w') = 2 then
                  date_format(date, '%d')
               end 二,
               case
                 when date_format(date, '%w') = 3 then
                  date_format(date, '%d')
               end 三,
               case
                 when date_format(date, '%w') = 4 then
                  date_format(date, '%d')
               end 四,
               case
                 when date_format(date, '%w') = 5 then
                  date_format(date, '%d')
               end 五,
               case
                 when date_format(date, '%w') = 6 then
                  date_format(date, '%d')
               end 六,
               case
                 when date_format(date, '%w') = 0 then
                  date_format(date, '%d')
               end 日
          from (WITH t_i AS(WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL
                                                            SELECT n + 1
                                                              FROM x
                                                             WHERE n < 1000
                                                    )
                 SELECT n as i
                   FROM x), t_date AS (select last_day(date_add(CURRENT_DATE(),
                                                                interval -
                                                                month(CURRENT_DATE())
                                                                month)) date)
                 select date_add(date, interval i day) date
                   from t_i, t_date
                  where date_add(date, interval i day) <=
                        date_add(last_day(date_add(CURRENT_DATE(),
                                                   interval -
                                                   month(CURRENT_DATE()) month)),
                                 interval 1 year)) a
        ) a
 group by wk, month;

想不想成为SQL大神?想不想精通SQL优化,精通所有关系型数据库优化?
加我微信692162374 报名单独辅导 , 顺带我还可以教你Python,Oracle,MySQL,以及大数据

MySQL

猜你喜欢

转载自blog.csdn.net/robinson1988/article/details/106031008