Days_Between两个日期之间

时间:2012-11-18 15:25:54

标签: sql oracle

我想问一下如何检查两个日期之间的差异。

  1. BillingDate,这是一个日期类型,条目为“DD-MON-YYYY”

  2. ,另一个日期是当前日期。

  3. sys_date - BillingDate = daysFromBilled
    

    我发现很多例子他们确实说明了计算差异的第二个日期,但我要找的是当前日期之间的差异,所以我可以将它添加到日程表或工作中。

    我正在使用oracle btw。


    要添加的另一点,我将继续搜索,但如果您也可以推荐,我应该如何实现这样的功能:

    1. 计算所有BillingDate条目的日期差异
    2. 如果差异超过30天将“状态”设置为“晚”,则触发更改表。
    3. 如果状态超过60天,则服务属性将被更改并更改为剪切
    4. 这是我粗略的表格布局

      Cust             Billing
      --------         ----------
      CustID(PK)       BillingID(PK)
      LateStatus       LateStatus
      Service          BillingDate
                       CustID
      

      非常感谢。

      更新

      REPLACE视图DateDifference as select trunc(sysdate) - trunc(BillingDate) 来自Billing;

      似乎是合法的。

2 个答案:

答案 0 :(得分:1)

只需从另一个中减去一个日期:

BillingDate - sysdate

要在select语句中执行此操作,只需使用它:

select billingdate - sysdate as daysFromBilled
from ...

在触发器中使用常规赋值运算符:

declare
    daysFromBilled integer;

begin 
    daysFromBilled := :new.billingdate - sysdate;
...

将返回天数,包括时间不同时的小数值(Oracle中的DATE列也包含时间!)。

如果你只想要整天,请使用:

trunc(BillingDate) - trunc(sysdate)

你的陈述:

  

日期类型,条目为“DD-MON-YYYY”

表示对DATE值的工作方式存在误解。

DATE(或TIMESTAMP 有任何格式。

它们以二进制形式存储在您的列中。显示值时将应用 格式,从而将其转换为字符文字。这是您用于显示值的客户端应用程序的工作。 SQL * Plus使用NLS设置,其他SQL工具可能使用不同的配置。

答案 1 :(得分:0)

所有客户:

SELECT CUSTID
FROM BILLING
WHERE (SYSDATE - Billing_Date) >= 60
;

以下声明应更新差异为60天及以上的所有客户记录。此外,还添加了一个子句来检查服务是否先前未设置为CUT,因此您不会每次都更新相同的记录。

UPDATE CUST_TABLE
SET SERVICE = 'CUT'
WHERE CustID in ( SELECT CustID
                   FROM BILLING_TABLE
                   WHERE (Sysdate - Billing_Date) >= 60
                 )
  AND NVL(SERVICE, 'X') != 'CUT'
;