例 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLの日付/時刻関数と式

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/xmd1556127764262.ditamap
dita:ditavalPath
ja-JP/xmd1556127764262.ditaval
dita:id
B035-1211
Product Category
Software
Teradata Vantage

次の例では、1つの共通点CURRENT_TIMEを共有する2つの期間を比較します。

2つの期間が1つの共通点を共有するときには、定義によって重ならないため、返される結果はFALSEです。

SELECT 'OVERLAPS'
WHERE (CURRENT_TIME(0), INTERVAL '1' HOUR)
OVERLAPS (CURRENT_TIME(0), INTERVAL -'1' HOUR);

次の例は、前の例とほぼ同じです。ただし、引数は、1秒ずつ重なるように調整されました。結果はTRUEです。値‘OVERLAPS’が返されます。

SELECT 'OVERLAPS'
WHERE (CURRENT_TIME(0), INTERVAL '1' HOUR)
OVERLAPS (CURRENT_TIME(0) + INTERVAL '1' SECOND,INTERVAL -'1' HOUR);

次の例では、datetime_expression, datetime_expression形式のOVERLAPSを使用しています。2つのDATE期間が重なり合うので、結果はTRUEです。

SELECT 'OVERLAPS'
WHERE (DATE '2000-01-15',DATE '2002-12-15')
OVERLAPS (DATE '2001-06-15',DATE '2005-06-15');

次の例は前の例と同じですが、row_subqueryの形式になっています。

SELECT 'OVERLAPS'
WHERE (SELECT DATE '2000-01-15', DATE '2002-12-15')
OVERLAPS (SELECT DATE '2001-06-15', DATE '2005-06-15');

次の例にあるNULLは、2番目のdatetime_expressionの開始時刻が2001-06-13 15:00:00で、終了時刻がnullであることを示しています。

SELECT 'OVERLAPS'
WHERE (TIMESTAMP '2001-06-12 10:00:00', TIMESTAMP '2001-06-15 08:00:00')
OVERLAPS (TIMESTAMP '2001-06-13 15:00:00', NULL);

2番目の式の開始時刻は最初の式で定義されるTIMESTAMP間隔内にあるため、結果はTRUEです。

period1およびperiod2がPERIOD(DATE)列のemployeeテーブルに対して、次の問合わせを実行したとします。

SELECT * FROM employee WHERE period2 OVERLAPS period1;
Ename period1 period2
Adams ('2005-02-03', '2006-02-03') ('2005-02-03', '2006-02-03')
Mary ('2005-04-02', '2006-01-03') ('2005-02-03', '2006-02-03')
Jones ('2004-01-02', '2004-03-05') ('2004-03-05', '2004-10-07')
Randy ('2004-01-02', '2004-03-05') ('2004-03-07', '2004-10-07')
Simon ? ('2005-02-03', '2005-07-27')

結果は以下のようになります。

Ename period1 period2
Adams ('2005-02-03', '2006-02-03') ('2005-02-03', '2006-02-03')
Mary ('2005-04-02', '2006-01-03') ('2005-02-03', '2006-02-03')

次のテーブルと問合わせについて考慮します。

CREATE TABLE project
   (id INTEGER,
    analysis_phase PERIOD(DATE))
UNIQUE PRIMARY INDEX (id);
INSERT project (1, PERIOD(DATE'2010-06-21',DATE'2010-06-25'));
SELECT 'OVERLAPS'
FROM project
WHERE analysis_phase OVERLAPS 
      PERIOD(DATE'2010-06-24',NULL);

OVERLAPのオペランドの1つが、明示的にNULLを指定するPERIOD式を持つ期間タイプであるため、SELECT文はエラーを返します。

次のCREATE TABLE文で作成されたemployeeテーブルで、jobdur1とjobdur2が派生PERIOD列であるとします。

CREATE TABLE employee (
   eid INTEGER NOT NULL, 
   name VARCHAR(100) NOT NULL,
   deptno INTEGER NOT NULL,
   jobst1 DATE NOT NULL,
   jobend1   DATE NOT NULL,
   PERIOD FOR jobdur1(jobst1, jobend1),
   jobst2 DATE NOT NULL,
   jobend2   DATE NOT NULL,
   PERIOD FOR jobdur2(jobst2, jobend2)
   ) PRIMARY INDEX(eid);
EID Name Dept No JobSt1 JobEnd1 JobSt2 JobEnd2
1 Tom 101 DATE'2001-01-01' DATE'2004-01-01' DATE'2005-01-01' DATE'2006-01-01'
2 Rick 201 DATE'2005-01-01' DATE'2006-01-01' DATE'2001-01-01' DATE'2004-01-01'
3 Joo 301 DATE'2005-01-01' DATE'2006-01-01' DATE'2006-01-01' DATE'2007-01-01'
4 Tam 401 DATE'2001-01-01' DATE'2006-01-01' DATE'2002-01-01' DATE'2004-01-01'
5 Pat 501 DATE'2005-01-01' DATE'2007-01-01' DATE'2006-01-01' DATE'2008-01-01'
6 Jack 601 DATE'2005-01-01' DATE'2007-01-01' DATE'2007-01-01' DATE'2008-01-01'
7 Yu 701 DATE'2005-01-01' DATE'2007-01-01' DATE'2004-01-01' DATE'2005-01-01'
8 Tim 801 DATE'2005-01-01' DATE'2007-01-01' DATE'2005-01-01' DATE'2007-01-01'

次のSQL文では、OVERLAPSをemployeeテーブルの派生PERIOD列で使用しています。

SELECT eid, name, jobst1, jobend1, jobst2, jobend2 
FROM employee 
WHERE jobdur1 OVERLAPS jobdur2;

結果は以下のようになります。

EID Name Dept No JobSt1 JobEnd1 JobSt2 JobEnd2
4 Tam 401 DATE'2001-01-01' DATE'2006-01-01' DATE'2002-01-01' DATE'2004-01-01'
5 Pat 501 DATE'2005-01-01' DATE'2007-01-01' DATE'2006-01-01' DATE'2008-01-01'
8 Tim 801 DATE'2005-01-01' DATE'2007-01-01' DATE'2005-01-01' DATE'2007-01-01'