如何使用Oracle12c中的周期定义


Oracle12c中的一个新特性是一个称为“周期定义”或“时间有效性”的概念。

它是一个有用的特性,使您在某些情况下更容易编写查询。在本文中,我将解释这个特性是什么以及如何使用它。

这个“期间定义”特征是什么?

您是否见过数据库表中的记录使用生效日期(如开始日期和结束日期)来指示记录是否有效?

我在我工作过的大多数数据库中都看到了这一点,我也创建了一些使用了这一特性的数据库。

基本上,一个表有一个开始日期字段和一个结束日期字段。这两种类型都是日期类型。

字段指示此记录有效的日期范围。

然后,您将在查询中使用这些日期字段来计算出哪个记录是有效的,或具有有效日期范围的记录。

在Oracle12c中,the feature of "period definition",或引入了“时间有效性”。

它使Oracle和您更容易跟踪某一日期哪些记录是有效的。

那么,如何才能使用这个特性呢?

如何在表中添加期间定义

首先,您需要向表中添加一个期间定义。

假设你有一张这样的桌子:

CREATE TABLE product (
  product_Id NUMBER,
  product_name VARCHAR2(100),
  price NUMBER(10, 2),
  start_date DATE,
  end_date DATE);


通常情况下,您将拥有这两个日期字段,并且您的查询将需要有一个WHERE子句来单独检查它们,这使得它变得更加复杂,并可能降低性能。

若要将此期间定义功能添加到此表,请在表定义中添加一行:

CREATE TABLE product (
  product_Id NUMBER,
  product_name VARCHAR2(100),
  price NUMBER(10, 2),
  start_date DATE,
  end_date DATE
  period for valid (start_date, end_date));


有效行的此期间表示这是用于确定记录是否有效的两个日期。

如何在查询中使用期间定义?

因此,现在您的表中有了有效关键字的句点。你到底是怎么用的?

只需在SELECT语句中添加一行。

这可能是您以前提出的问题:

SELECT product_id, product_name, price, start_date, end_date
FROM product
WHERE start_date <= SYSDATE
AND end_date > SYSDATE;


您可以将查询更改为使用有效语法的截止日期:

SELECT product_id, product_name, price, start_date, end_date
FROM product
AS OF PERIOD FOR VALID SYSDATE;


此查询将查找sysdate介于start_date和end_date之间的记录。

其他日期呢?

您不必对此查询使用SYSDATE。可以使用任何日期值。例如,30天内有效的记录:

SELECT product_id, product_name, price, start_date, end_date
FROM product
AS OF PERIOD FOR VALID SYSDATE + 30;


或者,从昨天起有效的记录:

SELECT product_id, product_name, price, start_date, end_date
FROM product
AS OF PERIOD FOR VALID SYSDATE - 1;


或您向其提供的任何日期:

SELECT product_id, product_name, price, start_date, end_date
FROM product
AS OF PERIOD FOR VALID '01-JAN-2015';


正如您所看到的,这是一个非常简单的特性,但是如果您在数据库中使用这种格式的数据,它会非常有用。