1月23,24号总结

本文记录了作者在集训期间的学习经历,包括对二叉树的深入学习、参与在线编程竞赛的感受及遇到的问题,以及一周训练中的挑战与反思。

计划总是赶不上变化,一直以来,我做了很多次的计划,但最后都是因为某些原因坚持不下来;我坚持一项原则:玩的时候好好玩,学的时候就安下心来,踏踏实实的学,从周一到周四,每天都是从早上八点开始,到晚上12点睡觉前,我都是在努力的完成着我的计划,虽然有时进度会很慢,计划只能完成一点点,但是每天还是会有一点点的收获,这对于我来说,也算是一种小的进步了。1月23号迎来了集训以来的第一次活动,下午3:30,我便开始了疯狂的活动,跑了几圈,打了半个多小时的羽毛球,又打了很长时间的排球,整个手臂都不好了,到了晚上,因为运动量太大,整个人都感觉到很累,于是就趴在桌子上睡了一个多小时,整个晚上的训练就这么浑浑噩噩的过去了。。。。。。。。

回想起来,这两天就做了三件大事。

一:重新温习(学习)了二叉树,平时打比赛一般都用不着这算法,但是昨天做DFS的题目,遇到了一个根据中序序列和后序序列建二叉树,然后再DFS的题目,想着从学了二叉树之后,还没有好好的整理过,于是就从23号开始整理二叉树的笔记,各种概念,性质,遍历都轻松加easy地过掉了,剩下的就是建树。首先学习的就是根据给出的先序序列和中序序列建树,并通过后序序列遍历出来。当时学的时候这块知识就不是很明白,但是现在都大二了,我不能再这么不明白下去,于是我就开始研究学长给的代码,原理我明白,只是不知道如何去用代码实现,这一研究就是一下午加一晚上,期间无数次的手动模拟。。。。。。到了24号上午,我终于把研究好的先序中序建树写进了博客里,有了先序的铺垫,已知后序和中序建树的过程就很好理解了,于是很快也完成了这一部分的代码总结。现在,二叉树还有给出完整的序列,即没有节点的地方用特殊符号表示的建树过程还没有总结,二叉树的应用(求深度,叶子节点个数等)还没有总结,因为24号下午周赛,晚上又把23号晚上做的CF题完善了一下,所以没有抽出时间来完成,这剩余的任务就留到25号上午去完成了。

二:23号晚上12点准时做了CF的比赛,很长时间没有做CF了,因为CF时间改到晚上12以后,舍友们都睡了,我在宿舍里敲代码会影响到他们休息,所以也就没有参加正式比赛,只是白天把比赛题目做做。这么长时间没做比赛之后,明显感觉没有那种紧张的气氛,读题也没有那么快了(之前10分钟之内就能把第一道题目A掉),现在读题加上敲代码就用了20+分钟,期间还因为手残忘了把测试用的循环去掉,导致第一遍交就TLE,真不是一个好兆头。。。。。。之后打开第二道题目,在纸上也研究的差不多了,代码也敲出来了,准备交的时候,宿舍里的网很不给力的断掉了,之后再也没有连上,我也真是醉了。。。带着遗憾于晚上1:30左右睡觉觉。24号晚上,我又将第二道题目提交了一遍,WA,再看看吧。。。。。。对于数学这类问题,真是让人头疼呢。。。最后还是让歉政给讲明白的,其实很简单,他当时只是给我画了一个图,然后我就明白了,只怪做题的时候大脑不够用,转不过弯来。

三:做了一场苦逼的周赛

真心是感觉不能再爱了!!我喜欢409做周赛的方式,就像正式比赛一样,不过在这次比赛中,我可真是命途多舛呀。寒假开始集训后,为了能够更好地抱两个学长大神的大腿(当然也有其它各方面的原因),我选择了刚刚退队的亚楠姐的位置,可是谁知道那里的网速奇慢,平时练习交个代码半个多小时交不上,大大影响了我做题的效率,今天终于可以换个地方了,谁知道随机数跑出来的位置还不如我原来的位置,比赛开始了,我却连比赛网页都打不开。周围同学都在啪啪的敲代码,我还在苦逼地开网页,当时都要哭了。。。最后找到后台,换了位置,这个时候已经过去15分钟了,第一道题目很多人都已经做出来,我也没管那么多,为了防止再次打不开网页,我把所有的题目都打开了,然后找了头上的一个题就坐了起来,谁知道题目没有加载全,解释的图片没有加载出来,我硬是读了半个小时的题目,自己想除了是个什么样的过程,忽然间发现自己不会做,然后就开始发懵,但也不是办法,还是硬着头皮写了下去,1个多小时候,我交上了第一个WA的代码,看了排行榜,瞬间发现我交上的题目和别人的不一样,人家作对的是第一题,我做错的是最后一题,通常都是最难的。。。。。。当时我都要哭了,这样一来,我折腾的比别人少了1个多小时的比赛时间,看看自己还是垫底的,一个题目也做不出来,当时那心情呀,既无奈,又无助。。。怎么办?还能怎么办?只有沉下心来从头开始呗。。。。。。就这样,我坚持到了最后,做出来了2个题,第三个题改完了,比赛也结束了,这都是命啊。。。。。。

总结一下这两天过得,完成的任务不多,但真的感觉好累,整个人的神经都是紧绷绷的,其中还有一个很大的遗憾就是晚上的BC没有做成现场赛,因为出去吃饭吃的晚,回来耽误了黄金时间,也就只能看看题,没有交了。。。。。。


计划赶不上变化,今天还有一点历史遗留问题,我一定要在最短的时间内完成,25号把周赛没有交上的题再做一下,CF还有一个第三题,读完了只剩敲代码了,也要完成。在周赛中用到了因式分解,忘记怎么做了,当时是暴利出来的,这个问题要写一下总结。还有就是做过的4道题目写题解。


已经凌晨1点了,早早去睡觉觉吧,还要迎接新的太阳呢,加油!!

<think>好的,我现在需要解决用户在Oracle SQL中获取每月15到月底的日期区间的问题。首先,我得理清用户的具体需求。用户希望得到一个方法或SQL查询,能够生成每个月的15开始到该月最后一天的日期区间。可能需要返回两个日期字段,开始日期(每月15)和结束日期(该月最后一天)。 首先,我需要考虑如何动态生成每个月的15和对应的月底日期。Oracle中有处理日期的函数,比如`LAST_DAY`函数,可以获取某个月的最后一天,例如`LAST_DAY(SYSDATE)`会返回当前月的最后一天日期。所以,用户提到的月底可以通过这个函数轻松得到。 接下来,如何获取15呢?如果当前日期是本月的15或之后,那么当月的15就是开始日期;如果是15之前,可能需要上个月的15吗?或者用户是否需要生成所有月份的15到月底的区间,不管当前日期是什么时候?这可能需要进一步明确,但根据用户的问题描述,可能指的是对于任意给定日期,生成该月的15到月底的区间。例如,输入一个日期参数,返回该日期所在月的15和月底。 例如,如果输入日期是2023-03-24,那么开始日期应该是2023-03-15,结束日期是2023-03-31。如果是输入日期是2023-04-05,那么开始日期是2023-04-15,结束日期是2023-04-30?不,这样可能在当月还未到15的时候,开始日期还没到。但用户可能需要的是该月的完整区间,不管当前日期是什么时候。因此,不管输入日期是该月的哪一天,都生成该月15和该月最后一天的日期。 所以,关键在于如何从任意日期中提取月份,并构造该月的15和最后一天。例如,给定日期为2023-05-10,构造出开始日期为2023-05-15,结束日期为2023-05-31。但如果日期是2023-06-20,则开始日期是2023-06-15,结束日期是2023-06-30。 接下来,我需要找到Oracle SQL中如何处理日期。首先,如何将任意日期转换为该月的15。可以使用`TRUNC(date_column, 'MM')`来获取该月的第一天,然后加上14天。例如,TRUNC(SYSDATE, 'MM') + 14,这样就能得到该月的15。例如,如果SYSDATE是2023-03-24,TRUNC(SYSDATE, 'MM')是2023-03-01,加14天就是2023-03-15。这似乎可行。 而月底的日期则可以用`LAST_DAY(date_column)`函数,例如LAST_DAY(SYSDATE)返回该月的最后一天。 因此,针对一个给定的日期,开始日期是TRUNC(date, 'MM') + 14,结束日期是LAST_DAY(date)。 那如果用户需要生成所有月份的区间,例如按月份生成每个月的15到月底,可能需要生成一个日期范围,或者针对某个表中的日期字段进行处理。但用户的问题可能更倾向于给定一个日期,获取该月的15到月底的区间。例如,用户可能想输入一个日期参数,如当前日期,然后返回对应的区间。 例如,查询语句可能如下: SELECT TRUNC(SYSDATE, 'MM') + 14 AS start_date, LAST_DAY(SYSDATE) AS end_date FROM DUAL; 这将返回当前日期所在月的15和最后一天。如果用户需要针对表中的每个日期字段进行处理,比如每个订单日期对应的当月15到月底,那么可以替换SYSDATE为表中的日期字段。 另外,如果用户希望生成所有月份的区间,比如从某个起始日期到当前日期之间的每个月的15到月底,可能需要使用层次查询或者递归查询来生成月份列表,然后对每个月份计算这两个日期。 例如,生成从2023年1月到当前月的每个月的区间: WITH months AS ( SELECT ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), LEVEL - 1) AS month_start FROM DUAL CONNECT BY LEVEL <= MONTHS_BETWEEN(SYSDATE, TRUNC(SYSDATE, 'YEAR')) + 1 ) SELECT month_start + 14 AS start_date, LAST_DAY(month_start) AS end_date FROM months; 这个查询使用CONNECT BY生成从年初到当前月的每个月的第一天,然后计算每个月的15和最后一天。 但用户的具体需求可能更简单,只需要处理单个日期的情况。根据用户的问题描述,用户可能需要的是对于任意输入日期,得到对应的当月15到月底的区间。因此,核心的解决方案是使用TRUNC和LAST_DAY函数。 另外,需要注意当月份的天数少于15天的情况吗?比如,如果月份只有28天(比如非闰年的二月),那么15仍然有效,因此TRUNC(date, 'MM') +14 总是有效的,因为每个月份至少有28天,所以加14天到该月第一天,总是能得到15。例如,二月的第一天是2023-02-01,加14天是2023-02-15,而LAST_DAY是2023-02-28。 因此,这个方法是可靠的。 总结步骤: 1. 使用TRUNC(date, 'MM')获取该月的第一天。 2. 加上14天得到该月的15。 3. 使用LAST_DAY(date)获取该月的最后一天。 因此,最终的SQL语句可以是: SELECT TRUNC(your_date_column, 'MM') + 14 AS start_date, LAST_DAY(your_date_column) AS end_date FROM your_table; 如果不需要从表中获取,而是针对特定日期,比如当前日期: SELECT TRUNC(SYSDATE, 'MM') + 14 AS start_date, LAST_DAY(SYSDATE) AS end_date FROM DUAL; 这样就能得到所需的结果。此外,用户提到的引用中的last_day函数的应用场景刚好与此问题相关[^1],因此可以引用说明。 可能需要注意的地方是,当输入日期是该月的第一天时,例如2023-04-01,TRUNC后的结果还是该月的第一天,加14天就是15,没有问题。 验证示例: 输入日期:2023-03-24 TRUNC('2023-03-24', 'MM') → 2023-03-01 加14天 → 2023-03-15 LAST_DAY('2023-03-24') → 2023-03-31 正确。 另一个测试:输入日期是2023-02-10: TRUNC('2023-02-10', 'MM') → 2023-02-01 加14 → 2023-02-15 LAST_DAY → 2023-02-28(非闰年) 正确。 如果是闰年的二月: 输入日期:2024-02-05 TRUNC后的第一天是2024-02-01,加14天为2024-02-15,LAST_DAY是2024-02-29。 正确。 因此,该方法是可行的。</think>在Oracle数据库中获取每月15至月底的日期区间,可以通过以下步骤实现: ### 解决方案 1. **获取当月15** 使用`TRUNC(date, 'MM')`获取当前月份的第一天,然后加上14天得到15: $$ \text{start\_date} = \text{TRUNC}(输入日期, \text{'MM'}) + 14 $$ 2. **获取当月最后一天** 直接使用`LAST_DAY(date)`函数获取月底日期: $$ \text{end\_date} = \text{LAST\_DAY}(输入日期) $$ #### 示例SQL ```sql SELECT TRUNC(SYSDATE, 'MM') + 14 AS start_date, -- 当月15 LAST_DAY(SYSDATE) AS end_date -- 当月最后一天 FROM DUAL; ``` - **输入日期为`2023-03-24`时**: `start_date`为`2023-03-15`,`end_date`为`2023-03-31`[^1]。 - **输入日期为`2023-04-05`时**: `start_date`为`2023-04-15`,`end_date`为`2023-04-30`。 ### 扩展应用 若需生成表中所有记录对应月份的15至月底区间: ```sql SELECT TRUNC(your_date_column, 'MM') + 14 AS start_date, LAST_DAY(your_date_column) AS end_date FROM your_table; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值