【问题标题】:How to take difference between two dates specified as year with quarter如何获取指定为年和季度的两个日期之间的差异
【发布时间】:2019-02-05 05:13:54
【问题描述】:

我找不到两个日期之间的差异结果,我的格式是'YYYY-Q'

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

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

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

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

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

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

【问题讨论】:

  • 只是澄清一下,period 列是 varchar2(6) 持有像 '2017-2' 这样的值吗?

标签: sql oracle


【解决方案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 |

【讨论】:

    【解决方案2】:

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

    因此,将期间转换为季度数。比如 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
    

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

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      相关资源
      最近更新 更多