暂无图片
请教一SQL(生成时段序列,Oracle数据库)
我来答
分享
刘晓华
2024-04-13
请教一SQL(生成时段序列,Oracle数据库)
暂无图片 50M

各位高手,请帮忙看这个SQL怎么写?


规则:给定任意日期生成时段序列(序号,开始日期,截止日期),

假如给定的日期在2024/05/01之前(参考例子2020/5/7):跨2024/05/01的年度和此之前的年度为整年(见下面的例子),之后的第一个年度的截止日期为当年的12月31日,再之后的日期为自然年(生成3段)

假如给定的日期在2024/05/01之后(参考例子2025/2/10):第一年为整年,第二年截止日期为当年12月31日,再后面为自然年(生成3段)



我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
Thomas

variable a varchar2(10);
exec :a:='2020-05-07';

with t1 as
(select add_months(to_date(:a,'yyyy-mm-dd'),(level-1)*12) as st_date,add_months(to_date(:a,'yyyy-mm-dd'),level*12)-1 as ed_date,level as rn from dual connect by
add_months(to_date(:a,'yyyy-mm-dd'),level*12)<=case when :a<=date '2024-05-01' then date '2026-04-30' else date '2027-04-30' end),
t2 as
(select t1.st_date,t1.ed_date,t1.rn,(select count(*) from t1) as ct from t1),
t3 as
(select t2.st_date,decode(rn,ct,to_date(extract(year from t2.st_date)||'-12-31','YYYY-MM-DD'),t2.ed_date) as ed_date from t2),
t4 as
(select add_months((select max(ed_date)+1 from t3),(level-1)*12) as st_date,add_months((select max(ed_date)+1 from t3),level*12)-1 as ed_date from dual connect by
level<=3)
select * from t3 union select * from t4;

ST_DATE ED_DATE
------------------- -------------------
2020-05-07 00:00:00 2021-05-06 00:00:00
2021-05-07 00:00:00 2022-05-06 00:00:00
2022-05-07 00:00:00 2023-05-06 00:00:00
2023-05-07 00:00:00 2024-05-06 00:00:00
2024-05-07 00:00:00 2024-12-31 00:00:00
2025-01-01 00:00:00 2025-12-31 00:00:00
2026-01-01 00:00:00 2026-12-31 00:00:00
2027-01-01 00:00:00 2027-12-31 00:00:00

8 rows selected.

exec :a:='2025-02-10';

ST_DATE ED_DATE
------------------- -------------------
2025-02-10 00:00:00 2026-02-09 00:00:00
2026-02-10 00:00:00 2026-12-31 00:00:00
2027-01-01 00:00:00 2027-12-31 00:00:00
2028-01-01 00:00:00 2028-12-31 00:00:00
2029-01-01 00:00:00 2029-12-31 00:00:00

暂无图片 评论
暂无图片 有用 3
打赏 0
暂无图片
回答交流
Markdown


请输入正文
提交
相关推荐
AWR分析报告问题求助:AWR报告有没有可以快速定位问题点,太长了
回答 2
先优化有问题的SQL;另外相似的SQL进行绑定变量;对于比较大的SQL看看是否可以拆解;然后看看是否IO有所改善。如果还不行需要提升IO能力。
oracle 如何实现MySQL中的int(11)?
回答 3
你是为了要长度还是要数据多少?int(11)的11只是位数和内容多少无关
求oracle 11.2.0.4的安装包
回答 1
https://www.modb.pro/issue/33279
Oracle表没有时间戳,怎么判断每天的增量数据?
回答 1
如果不能加时间戳字段,可以尝试这样:比如原表主键为ID,那么,建立一个日志表,其主键为IDOPEDATE:createtabletlog(idvarchar2(20),opetypevarchar2(
数据库alert日志
回答 3
你要是之前的alert内容不需要了,就不需要备份alert日志。不过空间够的话,建议备份。
请问有没有使用DATAX迁移oracle数据到PostgreSQL
回答 1
可以尝试下国内的ETLCloud,提供很多数据集成和转换功能,支持多种数据源的连接和转换操作,包括数据格式转换、数据清洗、字段映射等操作,能够将转换后的数据加载到目标系统中,可视化操作界面,刚进门也能
大佬们,麻烦求助下排查思路?如下图所示
回答 2
问题提问不清晰,图片无法反馈问题
数据泵导入问题
回答 1
如果对比对象数量是一致的,这种现象是正常的,如果索引存在碎片或者空块,expdp导出,导入后是会回收这一部分资源的。indexpartition是索引分区,indexsubpartition是索引子分
Oracle impdp 如果要导入到一个新的精简表,不要部分列,可以导入的时候选择部分导入吗?
回答 2
已采纳
9i创建新表取部分字段导入10g,11g使用ORACLEDATAPUMP12c及以上数据泵支持VIEWSASTABLES即创建视图,数据表可以处理视图然后导出视图,实际当表导入就可以。参考链接http
listener.ora文件没有,监听也起来了,这是什么原因?
回答 3
listener.ora文件没有,Oracle会采用默认的设置启动监听,这是没问题的,Becausealloftheconfigurationparametershavedefaultvalues,i