0

我正在处理一个家庭作业问题,我很接近,但我认为需要一些数据转换方面的帮助。或 sysdate - start_date 计算

问题是:

使用 EX 模式,编写一个 SELECT 语句,从 Date_Sample 表(格式如下)中检索 date_id 和 start_date,然后是一个名为 Years_and_Months_Since_Start 的列,该列使用间隔函数检索 start_date 和系统日期。(您的值将根据您进行此实验的日期而有所不同。)仅显示开始日期的月和日等于 2 月 28 日(任何一年)的记录。

DATE_ID     START_DATE                          YEARS_AND_MONTHS_SINCE_START 
2           Sunday   , February  28, 1999       13-8                         
4           Monday  , February  28, 2005        7-8                          
5           Tuesday  , February  28, 2006       6-8 

我们引用这个问题的 EX 模式只是一个包含两列的 Date_Sample 表:

DATE_ID     NUMBER NOT Null

START_DATE  DATE

我写了这段代码:

SELECT date_id, TO_CHAR(start_date, 'Day, MONTH DD, YYYY') AS start_date , 
  NUMTOYMINTERVAL((SYSDATE - start_date), 'YEAR') AS years_and_months_since_start
FROM  date_sample
WHERE TO_CHAR(start_date, 'MM/DD') = '02/28';

但是我的 Years and months since start 列无法正常工作。当计算的日期是从 1999 年开始时,数年和数月的数字非常高。即,它应该是 13-8,我得到 5027-2,所以我知道它不正确。我使用了 NUMTOYMINTERVAL,这应该是正确的,但不要认为 sysdate-start_date 有效。start_date 的数据类型只是日期。我尝试了 ROUND,但可能需要一些帮助才能使其正确。

我的计算出了点问题,并试图弄清楚如何在那里获得正确的间隔。不确定我是否已向所有人提供了足够的信息,但如果我在您之前弄清楚,我会告诉您。

这是 Murach 的 Oracle 和 SQL/PL 书第 17 章中的一个问题,是否有其他人正在尝试学习该章。第 559 页。

4

2 回答 2

1

你会想要MONTHS_BETWEEN的,numtoyminterval因为减去两个日期变量的乘积会在几天内给出答案,这对你来说是不可用的,而且它如此之高的原因是你告诉 Oracle 答案是几年!还要fm在 to_char 上使用修饰符来防止多余的空格。

select date_id, 
       to_char(start_date, 'fmDay, Month DD, YYYY') as start_date,
       extract(year from numtoyminterval(months_between(trunc(sysdate), start_date), 'month') )
       || '-' ||
       extract(month from numtoyminterval(months_between(trunc(sysdate), start_date), 'month') )
       as years_and_months_since_start
  from your_table
 where to_char(start_date, 'MM/DD') = '02/28';
于 2012-12-03T10:59:18.150 回答
0

您可以像这样简化答案

SELECT date_id,  start_date, numtoyminterval(months_between(sysdate, start_date), 'month') as "Years and Months Since Start"
FROM date_sample
WHERE EXTRACT (MONTH FROM start_date) = 2 AND EXTRACT (DAY FROM start_date) = 28;
于 2013-05-04T06:50:08.200 回答