Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取所需的季度日期-SQL_Sql_Oracle - Fatal编程技术网

获取所需的季度日期-SQL

获取所需的季度日期-SQL,sql,oracle,Sql,Oracle,我希望在单个sql语句中根据输入列1获得所需的输出列2 -201701 - 31-Dec-2016 -201702 - 31-Dec-2016 -201703 - 31-Mar-2017 -201704 - 31-Mar-2017 -201705 - 31-Mar-2017 -201706 - 30-Jun-2017 -201707 - 30-Jun-2017 -201708 - 30-Jun-2017 -201709 - 30-Sep-2017 -201710 - 30-Sep-2017 -2

我希望在单个sql语句中根据输入列1获得所需的输出列2

-201701 - 31-Dec-2016
-201702 - 31-Dec-2016
-201703 - 31-Mar-2017
-201704 - 31-Mar-2017
-201705 - 31-Mar-2017
-201706 - 30-Jun-2017
-201707 - 30-Jun-2017
-201708 - 30-Jun-2017
-201709 - 30-Sep-2017
-201710 - 30-Sep-2017
-201711 - 30-Sep-2017
-201712 - 31-Dec-2017
到目前为止,我得到了一个很好的解决方案:

select TRUNC(LAST_DAY(TO_DATE([Column 1] value,'RRRRMM'))+1,'Q')-1 from dual

请告知是否有其他解决方案,或者在未来几年中,我将面临的任何问题……

您的解决方案将处理未来

可以使用以下表达式进行简单修改:

 trunc(trunc(add_months(dt,+1),'mm'),'q')-1
e、 g:

但到目前为止,没什么区别


考虑使用YYYY代替RRRR。RRRR掩码假定当前世纪用于计算。

您的公式看起来正确,将来不太可能出现问题。一个吹毛求疵的问题,为什么使用RRRR而不是YYYY?在这里它不会破坏任何东西,但是YYYY应该是首选,除非有很好的理由使用RRRR,否则习惯的力量。我已经使用oracle有一段时间了,我总是使用RRRR。无论如何,我只是想找出两者之间的区别:检查。当您只指定年份的2位数字时,它起作用,但当您指定4位时,它没有任何意义。如果您传入的年份有4位数字,则RRRR格式掩码不会假定当前世纪,即“截止日期”为“2129”,“RRRR”输出的日期以2129为年份。这只在处理两位数年份时才重要,是解决Y2K问题的一个办法。在这个时代,任何人都不应该使用两位数的年份。。。哈哈哈谢谢你说的对。永远不要依赖于简单的表达。可能会带来一些麻烦。我不知道它最初的设计目的是什么。谢谢如果2099年再次发生麻烦,我希望它不会变成任何形式;我认为下一个问题是。那么很可能是10万日元,但我不打算在这里呆那么久!您的查询也可以工作。正如你所指出的,它不会有太大的区别,所以我将继续使用旧的1。谢谢你的回答:为什么你认为这是答案?它是如何工作的?简单地告诉某人在没有任何上下文或意义的情况下更改代码并不能帮助他们了解自己做错了什么。????有一个上下文!OP描述了他的问题,给出了他的解决方案,也没有任何解释,就像我一样。他没有做错什么,我也没有告诉他要改变什么。他向别人寻求解决办法,我给了他一个。我认为这不需要任何解释。我只是假设任何人都会明白,在一个月的第一天之后32天,你总是在下个月。就像查询OP一样简单,在一个月的最后一天之后的一天,您就进入了下一个月。但是请放心,我永远不会回答她任何问题,所以,如果没有上下文,你应该在你的帖子中添加解释。没有上下文就没有问题,这就是问题所在。这是一个学习的网站。仅仅是代码的帖子通常不受欢迎。你的答案应该提供一个问题的上下文链接,并解释为什么它是这样工作的。你不应该假设其他用户已经知道了什么,这不是这个网站的目的。这是一个学习网站,您的答案应该反映完整的答案和解释,以便其他人将来可以从中学习。您应该参考上面发布的另一个答案,该答案的代码与您的代码几乎相同,但也有更多相关信息。
with dat as (
  select trunc(to_date('2017'||to_char(level,'00'),'yyyymm')) dt 
    from dual where level <= 12 
    connect by level < 12)
select dt, trunc( dt + 32, 'q')-1 quarter 
  from dat;
with dat as (
  select trunc(to_date('2017'||to_char(level,'00'),'yyyymm')) dt 
    from dual where level <= 12 
    connect by level < 12)
select dt, trunc( dt + 32, 'q')-1 quarter 
  from dat;