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

时间:2018-08-30 09:46:44

标签: sql oracle

我找不到两个日期之间的差值的结果,我的堡垒是'YYYY-Q'

select MAX(t.period), MIN(t.period) from table t

,我也想把MAX(t.period)-MIN(t.period)列。当我尝试将其从日期转换为char时遇到问题(ORA-01722数字不正确)

select MAX(t.period), MIN(t.period) to_char(MAX(t.period), 'YYYY-Q') from table t 

当我尝试添加日期时,我也遇到问题(ORA-01820:格式代码无法以日期输入格式出现)

select MAX(t.period), MIN(t.period) to_date(MAX(t.period), 'YYYY-Q') from table t

我只想在两个日期之间进行区别,而不能进行单个转换...我的期间列格式与我输入的“ YYYY-Q”格式相同,如果我有例如2005-4日期-我想要得到6个结果的2004-2日期,它甚至可能吗?

2 个答案:

答案 0 :(得分:1)

您可以使用以下方法将期间的年部分转换为年初:

TO_DATE( SUBSTR( period, 1, 4 ) || '0101', 'YYYYMMDD' )

然后,您可以使用第一个季度的每个季度增加3个月的时间:

ADD_MONTHS(
  TO_DATE( SUBSTR( period, 1, 4 ) || '0101', 'YYYYMMDD' ),
  3 * ( SUBSTR( period, 6, 1 ) - 1 )
)

然后,您可以使用MONTHS_BETWEEN来查找日期之间的差,然后将其除以3得到四分之一数的差。

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE table_name ( period ) AS
SELECT '2005-4' FROM DUAL UNION ALL
SELECT '2004-2' FROM DUAL;

查询1

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
)

Results

|           RANGE | QUARTERS_DIFFERENCE |
|-----------------|---------------------|
| 2004-2 - 2005-4 |                   6 |

答案 1 :(得分:1)

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

因此,将期间转换为季度数。例如,可以将2000-1转换为2000 * 4 +1 =80001。这些数字的差是您想要的。

所以:

select ( ( substr(max(period), 1, 4) * 4 + substr(max(period), -1) ) - 
         ( substr(min(period), 1, 4) * 4 + substr(min(period), -1) )
       ) as diff_q

请注意,这使用了隐式转换,如果所有值的确都遵循这种格式,那就没问题了。