Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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
时间戳和间隔:NUMTOYMINTERVAL SYSTDATE计算SQL查询_Sql_Oracle_Intervals - Fatal编程技术网

时间戳和间隔:NUMTOYMINTERVAL SYSTDATE计算SQL查询

时间戳和间隔:NUMTOYMINTERVAL SYSTDATE计算SQL查询,sql,oracle,intervals,Sql,Oracle,Intervals,我正在解决一个家庭作业问题,我很接近,但我想在数据转换方面需要一些帮助。或sysdate-开始日期计算 问题是: 使用EX模式,编写一条SELECT语句,从date_示例表(以下格式)中检索date_id和start_date,后跟一个名为YERS_和MOUNTS_的列,该列使用间隔函数检索start_日期和sysdate之间经过的年数和月数。(您的值将根据您进行此实验的日期而有所不同)仅显示开始日期为2月28日(任何年份)的记录 我们提到这个问题的EX模式只是一个带有两列的Date_示例表:

我正在解决一个家庭作业问题,我很接近,但我想在数据转换方面需要一些帮助。或sysdate-开始日期计算

问题是:

使用EX模式,编写一条SELECT语句,从date_示例表(以下格式)中检索date_id和start_date,后跟一个名为YERS_和MOUNTS_的列,该列使用间隔函数检索start_日期和sysdate之间经过的年数和月数。(您的值将根据您进行此实验的日期而有所不同)仅显示开始日期为2月28日(任何年份)的记录

我们提到这个问题的EX模式只是一个带有两列的Date_示例表:

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';
但我的“开始”专栏的年头和月数并没有正常工作。从1999年开始计算,每年和每月的数字都非常高。也就是说,应该是13-8,我得到5027-2,所以我知道这不正确。我使用了NUMTOYMINTERVAL,这应该是正确的,但不要认为sysdate-start\u日期起作用。开始日期的数据类型仅为日期。我试过了,但可能需要一些帮助才能把它做好

我的计算出了一些问题,试图找出如何得到正确的时间间隔。我不确定我是否已经向每个人提供了足够的信息,但如果我在你之前弄明白了,我会让你知道


这是Murach的《Oracle和SQL/PL》一书第17章中的一个问题,如果有人想学习这一章。第559页。

numtoymenterval
中,您需要
个月之间的时间,因为减去两个日期变量的乘积会以天为单位给出答案,而这对您来说是不可用的,其原因是您告诉Oracle答案是以年为单位的!还可以使用to_char上的
fm
修饰符来防止多余的空白

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';

你可以这样简化答案

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;

谢谢,这是去那里的路。没有摘录和年份的情况下编写查询的任何可能性。我们还没有在课堂上复习过。它确实给了我正确的答案,这才是最重要的。再次感谢您今天抽出时间!否,因为“interval”数据类型实际上是不可格式化的(Oracle很好地省略了),ie to_char()不能对它们产生任何影响。因此,如果您只是选择它,您将看到它的标准格式或+年-月,如+00000000 1-10。格式化它的唯一方法是使用extract()并手动构建字符串。
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;