Řešitelé (abecedně): Jaromír Ocelka, Šárka Procházková, Jaroslav Ráček
TimeDB je temporalní nastavba nad klasické relační databaze. Toto rozhraní bylo původně napsáno v jazyce Prolog včetně simulace relační databaze. V první verzi pro instalaci postačovala funkčí verze prologu - nebylo potřeba žádného dalšího softwaru. Vykon tohoto produktu byl zanedbatelný neboť simulace databaze programem, jenž je interpretován je nesrovnatelná s databázovými porodukty jako je Oracle, Informix, ... . Druhá verze je již pouze rozhraní mezi příkazy TimeSQL a relační databázi. V této verzi je zahrnuto i jednoduchý demostrační klient, který je zároveň ukázkou komunikace s rozhraním TimeDB.
Demostrační verzi je možné si zkopirovat na stránkách autora - firma TimeConsult (www.timeconsult.com). Tento systém je určen pro relační databaze Oracle, Sybase a planuje se podpora pro MS Access a Informix a další. Jelikož je TimeDB napsána v platformově nezávislém jazyce java a zároveň přistupuje do databáze jako obyčejný klient je možné jej provozovat na jakekoliv platformě (i rozdílnné od platformy relační databáze), na které existuje kompilace Java Virtual Machine. Komunikaci mezi relační databází a javou zajišťuje JDBC Driver.
Java Virtual Machine lze nalézt na serveru firmy Sun microsystems (www.javasoft.com). Zde je zdarma nabízen program Java Runtime Environment (JRE 1.2, JRE 1.1) jenž je potřebný pro instalaci provoz TimeDB2.
Potřebný JDBC Driver je největší problém. Pro každou relační databázi je většinou jiný ovladač. Jelikož jsme TimeDB2 testovali na databazi Oracle obrátili jsme se na server www.oracle.com. Serie odkazů Free Download/Free Software/ Oracle 7 JDBC OCI and JDBC Thin Drivers nás zavedla na stranku s JDBC ovladači pro databázi Oracle verze 7. Ovladače pro Windowns NT 4.0/Win95 jsme testovali jako první a funguji docela spolehlivě, ale obsahují binární knihovny určené pouze pro MS Windows na procesoru Intel. Druhý testovaný ovladač je označen názvem All Unix Platforms. Tento ovladač je napsán v čisté javě a jej možné jej použít nejenom na Unix platformě, ale i v MS Windows. Po zvolení ovladače je nutné provést zaregistrování a odsouhlasení s licencí. Po té se objeví stránka s odkazem na soubor. V případě ovladače pro All Unix Platforms je to odkaz na ftp serveru Oracle ftp://ftp.oracle.com/pub/www/jdbc/v7/jdbcthin.tar.
Produkt jsme tedy testovali na relační databázi Oracle v.7 na počítači aisa.fi.muni.cz. Jako klient nám sloužili nejprve pracovní stanice MS Windows NT 4.0 s JDBC ovladačem určeným pouze pro MS Windows. Pro provoz javy jsme použili JRE 1.2. Dále jsme produkt vyzkoušeli na na počítačích s operačními systémy UNIX na FI MU. Zde nám posloužil ovladač JDBC pro All Unix Platforms. A na závěr ovladač pro All Unix Platforms ukázal svou bezproblémovou funkčnost i na MS Windows.
Pro případné zájemce jsme zřidili dočasné zrcadlo s TimeDB2.0D a JDBC ovladačem All Unix Platforms v adresáři /home/ocelka/disk2/TimeDB na počítači aisa. Nyní popíšeme instalační proces pro UNIXové platformy na FI MU:
Ještě si v adresáři ~/TimeDB2.0D vytvoříme startovací skript se jménem start_time_db:# provedeme rozbaleni z archivu do adresare /tmp/timedb export ZDROJ=~ocelka/disk2/TimeDB mkdir /tmp/timedb cd /tmp/timedb cp $ZDROJ/*.gz /tmp/timedb cp $ZDROJ/*.tar /tmp/timedb # rozbaleni TimeDB2 gzip -d TimeDB2.0D.tar.gz tar -xvf TimeDB2.0D.tar # rozbaleni JDBC ovladace tar -xvf jdbcthin.tar # pro beh programu nam postacuje knihovna s tridami cp lib/classes111.zip TimeDB2.0D/oracle_jdbc.zip # potrebne soubory s programem si prekopirujeme do # domovskeho adresare do adresare TimeDB2.0D cp -r TimeDB2.0D ~ # pomocny adresar smazeme yes | rm -r /tmp/timedb cd ~/TimeDB2.0D # a pokud se nam nechce nastavovat parametry # JDBC ovladace pomoci dialogoveho okna # pouzije preddefinovany konfiguracni soubor cp $ZDROJ/prefs ~/TimeDB2.0D
a nastavíme práva na spuštění:#!/bin/bash case `uname -n` in anxur | oreias* | artemis ) module add java1.2 # pro SunOs ;; * ) module add java1.1 # pro ostatni ;; esac cd ~/TimeDB2.0D java -classpath oracle_jdbc.zip:classes TimeDB
Spuštění TimeDB je nyní jednoduché: ~/TimeDB2.0D/start_time_dbchmod a+x ~/TimeDB2.0D/start_time_db
Po spuštění si ještě zkontrolujeme nastavení programu. V menu TimeDB/Preferences by mělo být
Položku Application dir změníme na adresář s vlastní instalací TimeDB. Například /home/ocelka/TimeDB2.0D/. Konfiguraci potvrdíme pomocí Save a uložíme ukončením programu.Application dir:/tmp/ JDBC Driver: oracle.jdbc.driver.OracleDriver JDBC URL: jdbc:oracle:thin:@aisa.fi.muni.cz:1521:prod DBMS:Oracle
Před vlastním započetím práce je nutné nejprve provést připojení k databázi Oracle pomocí TimeDB/Open DB. Po prvním připojení je nutné vytvořit databázi (sada tabulek) pro TimeDB pomocí TimeDB/Create DB. Po vytvoření databáze mužeme příkazy zadávat do textové oblasti a spouštět tlačitkem execute, nebo napsat dávku příkazů do souboru a provést jejich spuštění pomocí menu File/Execute File. Veškeré textové výstupy se provádějí do terminálu z nějž jsme spustili TimeDB.
statement ::= (query | ddl | dml | control) ';' Query ----- timeFlag ::= [ 'nonsequenced' ] 'validtime' [ scalarExp ] coal ::= '(' 'period' ')' query ::= [ timeFlag ] queryExp queryExp ::= queryTerm { ('union' | 'except') queryTerm } queryTerm ::= queryFactor { 'intersect' queryFactor } queryFactor ::= '(' query ')' [ coal ] | sfw sfw ::= 'select' selectItemList 'from' tableRefList [ 'where' condExp ] selectItemList ::= '*' | selectItem { ',' selectItem } selectItem ::= scalarExp [ alias ] tableRefList ::= tableRef { ',' tableRef } tableRef ::= '(' query ')' [ coal ] alias [ colList ] | identifier [ coal ] [ alias ] alias ::= ['as'] identifier condExp ::= condTerm { 'or' condTerm } condTerm ::= condFactor { 'and' condFactor } condFactor ::= [ 'not' ] simpleCondFactor simpleCondFactor ::= '(' condExp ')' | scalarExp condOp scalarExp condOp ::= '<' | '>' | '<=' | '>=' | '<>' | '=' | 'precedes' | 'overlaps' | 'meets' | 'contains' scalarExp ::= term { ('+' | '-') term } term ::= factor { ('*' | '/') factor } factor ::= [ ('+' | '-') ] simpleFactor simpleFactor ::= colRef | const | '(' scalarExp ')' | 'abs' '(' scalarExp ')' colRef ::= identifier [ '.' identifier ] const ::= integer | float | ''' string ''' | interval | event | span interval ::= 'validtime' '(' identifier ')' | 'period' intervalExp | 'period' '(' scalarExp ',' scalarExp ')' intervalExp ::= '[' time '-' time ')' time ::= timeDBDate | eventExp event ::= ( 'begin' | 'end' ) '(' scalarExp ')' | ( 'first' | 'last' ) '(' scalarExp ',' scalarExp ')' | eventExp eventExp ::= 'now' | 'beginning' | 'forever' | 'date' dateString | 'date' timeDBDate | 'timestamp' timestampString dateString ::= ''' YYYY '-' MM '-' DD ''' timestampString ::= ''' YYYY '-' MM '-' DD ' ' HH ':' MM ':' SS ''' timeDBDate ::= YYYY [ '/' MM [ '/' DD [ '~' HH [ ':' MM [ ':' SS ]]]]] span ::= 'interval' spanExp spanExp ::= integer qualifier { integer qualifier } qualifier ::= 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second' Data Definition --------------- ddl ::= ddlTable | 'drop' 'table' ddlTable ::= 'create' 'table' identifier '(' colDefList ')' [ 'as' 'validtime' ] colDefList ::= colDef { ',' colDef } colDef ::= identifier dataType colList ::= col { ',' col } col ::= identifier dataType ::= 'number' [ typeLength ] | /* Oracle */ 'numeric' [ typeLength ] | /* Sybase */ 'smallint' | /* Cloudscape's JBMS */ 'longint' | /* Cloudscape's JBMS */ 'integer' | 'real' | 'float' | 'interval' | 'date' | 'period' | 'char' [ typeLength ] | 'varchar' [ typeLength ] typeLength ::= '(' integer ')' Data Manipulation ----------------- dml ::= [ timeFlag ] insert insert ::= 'insert' 'into' identifier valExp valExp ::= 'values' '(' valList ')' Control ------- control ::= 'commit' | 'rollback'
/*Vytvoreni tabulky studentu - jmeno, prijmeni a obor studia*/
/*Vytvoreni tabulky ubytovanych na kolejich - jmeno, prijmeni a cislo pokoje*/CREATE TABLE student(JMENO varchar(15), PRIJMENI varchar(20), studium varchar(10)) AS VALIDTIME;
/*Ruzne zpusoby vkladani do tabulky student*/CREATE TABLE koleje(JMENO varchar(15), PRIJMENI varchar(20), pokoj integer) AS VALIDTIME;
/*Ruzne zpusoby vkladani do tabulky koleje*/VALIDTIME PERIOD [1992-1997) INSERT INTO student VALUES ('Jan', 'Novak', 'ucitelske'); VALIDTIME PERIOD [now-2005) INSERT INTO student VALUES ('Petr', 'Dvorak', 'ucitelske'); VALIDTIME PERIOD [1992-forever) INSERT INTO student VALUES ('Jiri', 'Novak', 'ucitelske'); VALIDTIME PERIOD [1992-1993) INSERT INTO student VALUES ('Tomas', 'Dolezal', 'odborne'); INSERT INTO student VALUES ('Tomas', 'Dolezal', 'odborne'); VALIDTIME PERIOD [1998/1/1~10:36:14-forever) INSERT INTO student VALUES ('Jan', 'Novak', 'odborne'); VALIDTIME PERIOD [now-forever) INSERT INTO student VALUES ('Libor', 'Tesar', 'odborne');
/*Vypis tabulek bez casovych udaju*/VALIDTIME PERIOD [1992-1997) INSERT INTO koleje VALUES ('Pavel', 'Bures', 204); VALIDTIME PERIOD [1999/1/1~10:36:14-forever) INSERT INTO koleje VALUES ('Jan', 'Novak', 814); INSERT INTO koleje VALUES ('Petr', 'Dvorak', 204); VALIDTIME PERIOD [now-forever) INSERT INTO koleje VALUES ('Pavel', 'Svoboda', 206);
/*Vypis tabulek s casovymi udaji*/NONSEQUENCED VALIDTIME SELECT * FROM student; NONSEQUENCED VALIDTIME SELECT * FROM koleje;
/*Vypis studenty, kteri ve stejne dobe studovali a bydleli na kolejich, vcetne casoveho intervalu, kdy k tomu doslo*/VALIDTIME SELECT * FROM student; VALIDTIME SELECT * FROM koleje;
/*Vypis vsech dvojic studentu, kteri studovali ve stejne dobe, vcetne casoveho intervalu*/VALIDTIME SELECT * FROM student, koleje WHERE student.jmeno = koleje.jmeno AND student.prijmeni = koleje.prijmeni;
/*Totez bez udani casu*/VALIDTIME SELECT * FROM student (PERIOD) a1, student (PERIOD) a2;
/*Vypis studentu, kteri studovali v letech 1990-1994*/NONSEQUENCED VALIDTIME SELECT * FROM student (PERIOD) a1, student (PERIOD) a2;
/*zruseni obou tabulek*/VALIDTIME PERIOD [1990-1994) SELECT * FROM student;
DROP TABLE koleje;
/*Vytvoreni tabulky statu, ktera obsahuje nazev statu a hlavni mesto*/
/*Naplneni tabulky udaji*/CREATE TABLE stat (nazev char(20), mesto char(20)) AS VALIDTIME;
/*Nasleduje 5 prikazu pro vypis z tabulek:*/NONSEQUENCED VALIDTIME PERIOD [1198-1621) INSERT INTO stat VALUES ('Ceske kralovstvi', 'Praha'); NONSEQUENCED VALIDTIME PERIOD [1918-1939) INSERT INTO stat VALUES ('Ceskoslovensko', 'Praha'); NONSEQUENCED VALIDTIME PERIOD [1945-1993) INSERT INTO stat VALUES ('Ceskoslovensko', 'Praha'); NONSEQUENCED VALIDTIME PERIOD [1993-forever) INSERT INTO stat VALUES ('Ceska republika', 'Praha'); NONSEQUENCED VALIDTIME PERIOD [1940-1945) INSERT INTO stat VALUES ('Slovensko', 'Bratislava'); NONSEQUENCED VALIDTIME PERIOD [1993-forever) INSERT INTO stat VALUES ('Slovensko', 'Bratislava'); NONSEQUENCED VALIDTIME PERIOD [1025-1040) INSERT INTO stat VALUES ('Polsko', 'Gniezno'); NONSEQUENCED VALIDTIME PERIOD [1040-1596) INSERT INTO stat VALUES ('Polsko', 'Krakov'); NONSEQUENCED VALIDTIME PERIOD [1596-1795) INSERT INTO stat VALUES ('Polsko', 'Varsava'); NONSEQUENCED VALIDTIME PERIOD [1918-1939) INSERT INTO stat VALUES ('Polsko', 'Varsava'); NONSEQUENCED VALIDTIME PERIOD [1945-forever) INSERT INTO stat VALUES ('Polsko', 'Varsava');
/*Vypise nazvy vsech statu, ktere nekdy existovaly*/SELECT nazev, mesto FROM stat;
/*Vypise nazvy vsech statu, ktere nekdy existovaly.*/NONSEQUENCED VALIDTIME SELECT nazev, mesto FROM stat;
/*Vypise nazvy vsech nazvu statu, ktere nekdy existovaly, a uvede cas*/NONSEQUENCED VALIDTIME PERIOD [1400-1700) SELECT nazev, mesto FROM stat;
/*Vypise nazvy vsech nazvu statu, ktere existovaly v letech 1400-1700, a uvede cas*/VALIDTIME SELECT nazev, mesto FROM stat;
/*Nyni techto pet prikazu budeme ruzne modifikovat:*/VALIDTIME PERIOD [1400-1700) SELECT nazev, mesto FROM stat;
/*Pridame-li NONSEQUENCED VALIDTIME, vystup se meni*/(SELECT nazev, mesto FROM stat); (NONSEQUENCED VALIDTIME SELECT nazev, mesto FROM stat); (NONSEQUENCED VALIDTIME PERIOD [1400-1700) SELECT nazev, mesto FROM stat); (VALIDTIME SELECT nazev, mesto FROM stat); (VALIDTIME PERIOD [1400-1700) SELECT nazev, mesto FROM stat);
/*Pridame-li PERIOD [1600-1990), vypisi se stejne staty jako v predchozim pripade*/NONSEQUENCED VALIDTIME (SELECT nazev, mesto FROM stat); NONSEQUENCED VALIDTIME (NONSEQUENCED VALIDTIME SELECT nazev, mesto FROM stat); NONSEQUENCED VALIDTIME (NONSEQUENCED VALIDTIME PERIOD [1400-1700) SELECT nazev, mesto FROM stat); NONSEQUENCED VALIDTIME (VALIDTIME SELECT nazev, mesto FROM stat); NONSEQUENCED VALIDTIME (VALIDTIME PERIOD [1400-1700) SELECT nazev, mesto FROM stat);
/*Pokud vynechame NONSEQUENCED*/NONSEQUENCED VALIDTIME PERIOD [1600-1990) (SELECT nazev, mesto FROM stat); NONSEQUENCED VALIDTIME PERIOD [1600-1990) (NONSEQUENCED VALIDTIME SELECT nazev, mesto FROM stat); NONSEQUENCED VALIDTIME PERIOD [1600-1990) (NONSEQUENCED VALIDTIME PERIOD [1400-1700) SELECT nazev, mesto FROM stat); NONSEQUENCED VALIDTIME PERIOD [1600-1990) (VALIDTIME SELECT nazev, mesto FROM stat); NONSEQUENCED VALIDTIME PERIOD [1600-1990) (VALIDTIME PERIOD [1400-1700) SELECT nazev, mesto FROM stat);
/*Vypise nazvy vsech statu, ktere nekdy existovaly*/VALIDTIME (SELECT nazev, mesto FROM stat);
/*Vypise nazvy vsech statu, ktere nekdy existovaly*/VALIDTIME (NONSEQUENCED VALIDTIME PERIOD [1400-1700) SELECT nazev, mesto FROM stat);
/*Vypise nazvy vsech statu, existovaly v letech 1400-1700*/VALIDTIME (VALIDTIME SELECT nazev, mesto FROM stat);
/*Pridame-li PERIOD [1600-1990)*/VALIDTIME (VALIDTIME PERIOD [1400-1700) SELECT nazev, mesto FROM stat);
/*Vypise nazvy vsech statu, ktere nekdy existovaly*/VALIDTIME PERIOD [1600-1990) (SELECT nazev, mesto FROM stat);
/*Vypise nazvy vsech statu, ktere existovaly 1600-1990*/VALIDTIME PERIOD [1600-1990) (NONSEQUENCED VALIDTIME PERIOD [1400-1700) SELECT nazev, mesto FROM stat);
/*Vypise nazvy vsech statu, existovaly v letech 1600-1700*/VALIDTIME PERIOD [1600-1990) (VALIDTIME SELECT nazev, mesto FROM stat);
/*Zruseni tabulky*/VALIDTIME PERIOD [1600-1990) (VALIDTIME PERIOD [1400-1700) SELECT nazev, mesto FROM stat);
DROP TABLE stat;
Následně ji naplníme těmito vzorovými daty:create table timeTable(s interval, i period, e date);
Pro úplnost je třeba uvést, že první den v roce (tedy např. datum '1970-01-01') je reprezentován pouze rokem (tedy 1970), totéž platí pro první den v měsísi (např. 1973/3/1), který je prazentován rokem a dnem (tedy 1973/3).insert into timeTable values (interval 3 year 2 month, period [1989-1991), date '1970-01-01'); insert into timeTable values (interval 2 month 3 minute, period [1989-1991), date '1989-06-12'); insert into timeTable values (interval 2 second, period [1989-1991), date '1989-06-12');
Na příkladě nyní ukažme, jak lze časové intervaly sčítat, odčítat, vynásobit nebo vydělit nějakým číslem.
Každý interval z tabulky se zvýší postupně o vše každý z intervalů z téže tabulky.select a1.s + a2.s from timeTable a1, timeTable a2;
Pro odčítání bude situace podobná, možné jsou i záporné hodnoty. Položíme například dotaz:a1.s + a2.s --------------------------- 6 year 4 month 3 year 4 month 3 minute 3 year 2 month 2 second 3 year 4 month 3 minute 4 month 6 minute 2 month 3 minute 2 second 3 year 2 month 2 second 2 month 3 minute 2 second 4 second
Jeho výsledkem je:select a1.s - a2.s from timeTable a1, timeTable a2;
a1.s - a2.s --------------------------------------------------------- 0 second -2 year -11 month -29 day -23 hour -57 minute -3 year -1 month -29 day -23 hour -59 minute -58 second 2 year 11 month 29 day 23 hour 57 minute 0 second -2 month -2 minute -58 second 3 year 1 month 29 day 23 hour 59 minute 58 second 2 month 2 minute 58 second 0 second
Výsledkem je:select 2 * a1.s from timeTable a1;
Dále ukažme vydělení dvěmi, tj. požadujeme poloviční interval:2 * a1.s ------------------- 6 year 4 month 4 month 6 minute 4 second
Výsledkem je:select a1.s / 2 from timeTable a1;
a1.s / 2 ---------------------------- 1 year 7 month 1 month 1 minute 30 second 1 second
Výsledek:select a1.e + a2.s from timeTable a1, timeTable a2;
Odečtení intervalu od data:a1.e + a2.s ----------------- 1973/3 1992/8/12 1992/8/12 1970/3/1~0:3 1989/8/12~0:3 1989/8/12~0:3 1970/1/1~0:0:2 1989/6/12~0:0:2 1989/6/12~0:0:2
Výsledek:select a1.e - a2.s from timeTable a1, timeTable a2;
a1.e - a2.s --------------------- 1966/11 1986/4/12 1986/4/12 1969/10/30~23:57 1989/4/11~23:57 1989/4/11~23:57 1969/12/30~23:59:58 1989/6/11~23:59:58 1989/6/11~23:59:58
Výsledek dotazu:select * from timeTable a1, timeTable a2 where a1.i = a2.i;
Rovnost událostí (reprezentovaných datem):s i e s i e --------------------------------------------------------------------------------- 3 year 2 month [1989-1991) 1970 3 year 2 month [1989-1991) 1970 3 year 2 month [1989-1991) 1970 2 month 3 minute [1989-1991) 1989/6/12 3 year 2 month [1989-1991) 1970 2 second [1989-1991) 1989/6/12 2 month 3 minute [1989-1991) 1989/6/12 3 year 2 month [1989-1991) 1970 2 month 3 minute [1989-1991) 1989/6/12 2 month 3 minute [1989-1991) 1989/6/12 2 month 3 minute [1989-1991) 1989/6/12 2 second [1989-1991) 1989/6/12 2 second [1989-1991) 1989/6/12 3 year 2 month [1989-1991) 1970 2 second [1989-1991) 1989/6/12 2 month 3 minute [1989-1991) 1989/6/12 2 second [1989-1991) 1989/6/12 2 second [1989-1991) 1989/6/12
Výsledek:select * from timeTable a1, timeTable a2 where a1.e = a2.e;
s i e s i e --------------------------------------------------------------------------------- 3 year 2 month [1989-1991) 1970 3 year 2 month [1989-1991) 1970 2 month 3 minute [1989-1991) 1989/6/12 2 month 3 minute [1989-1991) 1989/6/12 2 month 3 minute [1989-1991) 1989/6/12 2 second [1989-1991) 1989/6/12 2 second [1989-1991) 1989/6/12 2 month 3 minute [1989-1991) 1989/6/12 2 second [1989-1991) 1989/6/12 2 second [1989-1991) 1989/6/12
Nyní se můžeme dotázat například na to, která období předchází jinému období.insert into timeTable values (interval 3 year 2 month, period [1979-1987), date '1965-02-03'); insert into timeTable values (interval 2 second, period [1986-1991), date '1980-06-12');
Výsledkem je:select * from timeTable a1, timeTable a2 where a1.i precedes a2.i;
Dalším dotazem může být, která událost (tedy datum) je dřívější.s i e s i e ------------------------------------------------------------------------------ 3 year 2 month [1989-1991) 1970 3 year 2 month [1979-1987) 1965/2/3 2 month 3 minute [1989-1991) 1989/6/12 3 year 2 month [1979-1987) 1965/2/3 2 second [1989-1991) 1989/6/12 3 year 2 month [1979-1987) 1965/2/3
Výsledkem jsou takové záznamy, kde první datum (první sloupeček e) následuje druhé datum (druhý sloupeček e).select * from timeTable a1, timeTable a2 where a1.e precedes a2.e;
Nyní provedeme dotaz na to, který interval předchází události.s i e s i e ------------------------------------------------------------------------------- 2 second [1986-1991) 1980/6/12 3 year 2 month [1979-1987) 1965/2/3 2 second [1986-1991) 1980/6/12 3 year 2 month [1989-1991) 1970 3 year 2 month [1989-1991) 1970 3 year 2 month [1979-1987) 1965/2/3 2 month 3 minute [1989-1991) 1989/6/12 3 year 2 month [1979-1987) 1965/2/3 2 month 3 minute [1989-1991) 1989/6/12 2 second [1986-1991) 1980/6/12 2 month 3 minute [1989-1991) 1989/6/12 3 year 2 month [1989-1991) 1970 2 second [1989-1991) 1989/6/12 3 year 2 month [1979-1987) 1965/2/3 2 second [1989-1991) 1989/6/12 2 second [1986-1991) 1980/6/12 2 second [1989-1991) 1989/6/12 3 year 2 month [1989-1991) 1970
Výsledkem jsou záznamy, kde interval (druhý sloupeček i) skončil dříve než nastala událost (první sloupeček e).select * from timeTable a1, timeTable a2 where a1.i precedes a2.e;
Dalším dotazem jedotaz opačný, tedy která událost předchází intervalu.s i e s i e ------------------------------------------------------------------------------ 2 month 3 minute [1989-1991) 1989/6/12 3 year 2 month [1979-1987) 1965/2/3 2 second [1989-1991) 1989/6/12 3 year 2 month [1979-1987) 1965/2/3
Výsledkem jsou záznamy, kde událost (druhý sloupeček e) nastala dříve než doba intervalu (první sloupeček i).select * from timeTable a1, timeTable a2 where a1.e precedes a2.i;
s i e s i e ------------------------------------------------------------------------------- 3 year 2 month [1979-1987) 1965/2/3 3 year 2 month [1979-1987) 1965/2/3 3 year 2 month [1979-1987) 1965/2/3 3 year 2 month [1989-1991) 1970 2 second [1986-1991) 1980/6/12 3 year 2 month [1979-1987) 1965/2/3 2 second [1986-1991) 1980/6/12 2 second [1986-1991) 1980/6/12 2 second [1986-1991) 1980/6/12 3 year 2 month [1989-1991) 1970 3 year 2 month [1989-1991) 1970 3 year 2 month [1979-1987) 1965/2/3 3 year 2 month [1989-1991) 1970 2 second [1986-1991) 1980/6/12 3 year 2 month [1989-1991) 1970 3 year 2 month [1989-1991) 1970 2 month 3 minute [1989-1991) 1989/6/12 3 year 2 month [1979-1987) 1965/2/3 2 month 3 minute [1989-1991) 1989/6/12 2 second [1986-1991) 1980/6/12 2 month 3 minute [1989-1991) 1989/6/12 3 year 2 month [1989-1991) 1970 2 second [1989-1991) 1989/6/12 3 year 2 month [1979-1987) 1965/2/3 2 second [1989-1991) 1989/6/12 2 second [1986-1991) 1980/6/12 2 second [1989-1991) 1989/6/12 3 year 2 month [1989-1991) 1970
Naplníme ji těmito daty:create table timeTable(s interval, i period, e date);
Nyní můžeme položit následující dotaz:insert into timeTable values (interval 3 year 2 month, period [1979-1987), date '1965-02-03'); insert into timeTable values (interval 2 second, period [1986-1988), date '1980-06-12'); insert into timeTable values (interval 2 second, period [1989-1991), date '1989-06-12');
Výsledek je:select * from timeTable a1, timeTable a2 where a1.i overlaps a2.i;
s i e s i e ----------------------------------------------------------------------------- 3 year 2 month [1979-1987) 1965/2/3 3 year 2 month [1979-1987) 1965/2/3 3 year 2 month [1979-1987) 1965/2/3 2 second [1986-1988) 1980/6/12 2 second [1986-1988) 1980/6/12 3 year 2 month [1979-1987) 1965/2/3 2 second [1986-1988) 1980/6/12 2 second [1986-1988) 1980/6/12 2 second [1989-1991) 1989/6/12 2 second [1989-1991) 1989/6/12
Dotaz na podinterval:insert into timeTable values (interval 3 year 2 month, period [1979-1997), date '1975-02-03'); insert into timeTable values (interval 2 second, period [1986-1991), date '1980-06-12'); insert into timeTable values (interval 2 second, period [1986-1988), date '1987-06-12');
Výsledek:select * from timeTable a1, timeTable a2 where a1.i contains a2.i;
Po následujím dotazu by se zdála pravděpodobná odpověď, že rok 1980 je obsažen v období [1979-1997) a rok 1987 je v [1986-1988).s i e s i e ---------------------------------------------------------------------- 2 second [1986-1991) 1980/6/12 3 year 2 month [1979-1997) 1975/2/3 2 second [1986-1988) 1987/6/12 3 year 2 month [1979-1997) 1975/2/3 2 second [1986-1988) 1987/6/12 2 second [1986-1991) 1980/6/12
Výsledkem je bohuželselect * from timeTable a1, timeTable a2 where a1.i contains a2.e;
No rows selected
a naplníme daty:create table test (i integer, r real, f float) as validtime;
Nyní uvádíme některé příklady:validtime period [1980-1990) insert into test values(1, 1.23, 1.235); validtime period [1970-1995) insert into test values(1.9, 5.23875, 11.235); validtime period [1990-2001) insert into test values(1.9, 5.23875, 11.235);
Výsledek je:validtime select 3*4+12 from test;
nebo např. dotaz s absolutní hodnotou:valid 3 * 4 + 12 ------------------------ [1980-1990) 24 [1970-1995) 24 [1990-2001) 24
Výsledek:validtime select abs(3*4+12-25) from test;
Pokud nechceme, aby se v záhlaví výsledku objevoval výraz abs(3 * 4 + 12 - 25), můžeme si sloupeček označit např. symbolem a. Pak by dotaz vypadal takto:valid abs(3 * 4 + 12 - 25) ---------------------------------- [1980-1990) 1 [1970-1995) 1 [1990-2001) 1
Výsledek je stejný, liší se jen pojmenování sloupečku.validtime select abs(3*4+12-25) a from test;
V dotazu lze použít rovněž jména atributů:valid a --------------- [1980-1990) 1 [1970-1995) 1 [1990-2001) 1
Výsledek pak vypadá:validtime select abs(3*4+r-25) from test;
valid abs(3 * 4 + r - 25) --------------------------------- [1980-1990) 11.77 [1970-1995) 7.761250 [1990-2001) 7.761250nebo jiný příklad:
Výsledkem je:validtime select i+r+f a from test;
valid a ----------------------- [1980-1990) 3.4650 [1970-1995) 18.473750 [1990-2001) 18.473750