Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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,我找不到两个日期之间差异的结果,我的fortmat是'YYYY-Q' select MAX(t.period), MIN(t.period) from table t 我想把MAX(t.period)-MIN(t.period)列也放进去。当我试图将其从日期转换为字符时,我遇到了问题(ORA-01722未正确编号) 当我尝试输入日期时,我也有问题(ORA-01820:格式代码不能以日期输入格式显示) 我只想区分两个日期,但不能做单一的凸面。。。我的句点列格式与我输入的格式“yyy-Q”相同,如

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

select MAX(t.period), MIN(t.period) from table t
我想把MAX(t.period)-MIN(t.period)列也放进去。当我试图将其从日期转换为字符时,我遇到了问题(ORA-01722未正确编号)

当我尝试输入日期时,我也有问题(ORA-01820:格式代码不能以日期输入格式显示)


我只想区分两个日期,但不能做单一的凸面。。。我的句点列格式与我输入的格式“yyy-Q”相同,如果我有例如2005-4日期-2004-2日期,我想得到6个结果,这可能吗

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

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\u BETWEEN
查找日期之间的差异,并除以3得到季度差异数

Oracle 11g R2架构设置

CREATE TABLE table_name ( period ) AS
SELECT '2005-4' FROM DUAL UNION ALL
SELECT '2004-2' FROM DUAL;
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
)
|           RANGE | QUARTERS_DIFFERENCE |
|-----------------|---------------------|
| 2004-2 - 2005-4 |                   6 |
查询1

CREATE TABLE table_name ( period ) AS
SELECT '2005-4' FROM DUAL UNION ALL
SELECT '2004-2' FROM DUAL;
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
)
|           RANGE | QUARTERS_DIFFERENCE |
|-----------------|---------------------|
| 2004-2 - 2005-4 |                   6 |

CREATE TABLE table_name ( period ) AS
SELECT '2005-4' FROM DUAL UNION ALL
SELECT '2004-2' FROM DUAL;
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
)
|           RANGE | QUARTERS_DIFFERENCE |
|-----------------|---------------------|
| 2004-2 - 2005-4 |                   6 |

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

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\u BETWEEN
查找日期之间的差异,并除以3得到季度差异数

Oracle 11g R2架构设置

CREATE TABLE table_name ( period ) AS
SELECT '2005-4' FROM DUAL UNION ALL
SELECT '2004-2' FROM DUAL;
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
)
|           RANGE | QUARTERS_DIFFERENCE |
|-----------------|---------------------|
| 2004-2 - 2005-4 |                   6 |
查询1

CREATE TABLE table_name ( period ) AS
SELECT '2005-4' FROM DUAL UNION ALL
SELECT '2004-2' FROM DUAL;
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
)
|           RANGE | QUARTERS_DIFFERENCE |
|-----------------|---------------------|
| 2004-2 - 2005-4 |                   6 |

CREATE TABLE table_name ( period ) AS
SELECT '2005-4' FROM DUAL UNION ALL
SELECT '2004-2' FROM DUAL;
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
)
|           RANGE | QUARTERS_DIFFERENCE |
|-----------------|---------------------|
| 2004-2 - 2005-4 |                   6 |

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

因此,将一个周期转换为几个季度。例如,2000-1可以转换为2000*4+1=80001。这些数字的差异就是你想要的

因此:


请注意,这使用隐式转换,如果您的所有值都遵循此格式,则可以使用隐式转换。

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

因此,将一个周期转换为几个季度。例如,2000-1可以转换为2000*4+1=80001。这些数字的差异就是你想要的

因此:


请注意,这使用隐式转换,如果您的所有值都遵循此格式,这应该是很好的。

只是为了澄清,是
期间
列a
varchar2(6)
包含
'2017-2'
?只是为了澄清,是
期间
列a
varchar2(6)
持有类似于
'2017-2'