首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算指定为年和季度的两个日期之间的差异

如何计算指定为年和季度的两个日期之间的差异
EN

Stack Overflow用户
提问于 2018-08-30 17:46:44
回答 2查看 274关注 0票数 0

我找不到两个日期的差的结果,我的fortmat是'YYYY-Q‘

代码语言:javascript
复制
select MAX(t.period), MIN(t.period) from table t

我还想放入MAX(t.period)-MIN(t.period)列。当我尝试将它从日期转换为字符时,我遇到了问题(ORA-01722错误的数字)

代码语言:javascript
复制
select MAX(t.period), MIN(t.period) to_char(MAX(t.period), 'YYYY-Q') from table t 

当我尝试放入to_date时,我也遇到了问题(ORA-01820:格式代码不能以日期输入格式出现)

代码语言:javascript
复制
select MAX(t.period), MIN(t.period) to_date(MAX(t.period), 'YYYY-Q') from table t

我只想让两个日期不同,不能做单一的转换…我的period列的格式与我放入'YYYY-Q‘的格式相同,例如,如果我有2005-4日期- 2004-2日期,我想得到6个结果,这是可能的吗?

EN

回答 2

Stack Overflow用户

发布于 2018-08-30 18:12:59

您可以使用以下命令将期间的年组成换算为年初:

代码语言:javascript
复制
TO_DATE( SUBSTR( period, 1, 4 ) || '0101', 'YYYYMMDD' )

然后,您可以使用以下命令为第一个季度以外的每个季度添加3个月:

代码语言:javascript
复制
ADD_MONTHS(
  TO_DATE( SUBSTR( period, 1, 4 ) || '0101', 'YYYYMMDD' ),
  3 * ( SUBSTR( period, 6, 1 ) - 1 )
)

然后,您可以使用MONTHS_BETWEEN找出日期之间的差值,并除以3得到季度差值。

SQL Fiddle

Oracle 11g R2架构设置

代码语言:javascript
复制
CREATE TABLE table_name ( period ) AS
SELECT '2005-4' FROM DUAL UNION ALL
SELECT '2004-2' FROM DUAL;

查询1

代码语言:javascript
复制
SELECT MIN( period ) || ' - ' || MAX( period ) AS range,
       MONTHS_BETWEEN( MAX( period_start ), MIN( period_start ) ) / 3
         AS quarters_difference
FROM   (
  SELECT period,
         ADD_MONTHS(
           TO_DATE( SUBSTR( period, 1, 4 ) || '0101', 'YYYYMMDD' ),
           3 * ( SUBSTR( period, 6, 1 ) - 1 )
         ) period_start
  FROM   table_name
)

代码语言:javascript
复制
|           RANGE | QUARTERS_DIFFERENCE |
|-----------------|---------------------|
| 2004-2 - 2005-4 |                   6 |
票数 1
EN

Stack Overflow用户

发布于 2018-08-30 18:52:47

您可以在“季度”而不是日期(或月份)空间中进行算术运算。

因此,将一个句号转换为若干个季度。例如,2000-1可以转换为2000 *4+1= 80001。这些数字之间的差异就是您想要的。

所以:

代码语言:javascript
复制
select ( ( substr(max(period), 1, 4) * 4 + substr(max(period), -1) ) - 
         ( substr(min(period), 1, 4) * 4 + substr(min(period), -1) )
       ) as diff_q

请注意,这使用了隐式转换,如果您的所有值确实都遵循这种格式,那么隐式转换就可以了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52093966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档