我找不到两个日期之间的差值的结果,我的堡垒是'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日期,它甚至可能吗?
答案 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得到四分之一数的差。
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
请注意,这使用了隐式转换,如果所有值的确都遵循这种格式,那就没问题了。