【问题标题】:Timestamps and Intervals: NUMTOYMINTERVAL SYSTDATE CALCULATION SQL QUERY时间戳和间隔:NUMTOYMINTERVAL SYSTDATE CALCULATION SQL QUERY
【发布时间】:2012-12-03 10:39:10
【问题描述】:

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

问题是:

使用 EX 架构,编写一个 SELECT 语句,从 Date_Sample 表(格式如下)中检索 date_id 和 start_date,然后是一个名为 Years_and_Months_Since_Start 的列,该列使用间隔函数来检索两者之间经过的年数和月数start_date 和 sysdate。 (您的值将根据您执行此实验的日期而有所不同。)仅显示开始日期的月和日等于(任何年份的)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';

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

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

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

【问题讨论】:

    标签: sql oracle intervals


    【解决方案1】:

    你会想要MONTHS_BETWEEN 在那个numtoyminterval 中减去两个日期变量的乘积给出了对你不可用的天数的答案,它如此之高的原因是你告诉 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';
    

    【讨论】:

    • 感谢months_between 是去那里的方式。在没有提取和年份的情况下编写查询的任何可能性。我们还没有在课堂上讨论过这个。它确实给了我正确的答案,但这才是最重要的。再次感谢您今天的宝贵时间!
    • 否,因为“间隔”数据类型实际上是不可格式化的(Oracle 很好的省略),即 to_char() 不能对它们产生任何影响。因此,如果您只是选择它,您会以标准格式或 + 年-月(如 +000000001-10)看到它。格式化它的唯一方法是使用 extract() 并手动构建字符串。
    【解决方案2】:

    你可以这样简化答案

    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;
    

    【讨论】:

      猜你喜欢
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      相关资源
      最近更新 更多