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

Oracle写法:

select case
         when row_number() over(partition by mon order by week) = 1 then
          mon || '月'
       end as month,
       max(一) 一,
       max(二) 二,
       max(三) 三,
       max(四) 四,
       max(五) 五,
       max(六) 六,
       max(日) 日
  from (select case
                 when to_number(to_char(start_day + i, 'iw')) > 1 and
                      to_number(to_char(start_day + i, 'ddd')) < 7 then
                  0
                 else
                  to_number(to_char(start_day + i, 'iw'))
               end week,
               to_number(to_char(start_day + i, 'mm')) mon,
               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 mon, week
 order by mon, week;


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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值