DURATION...BEFORE
DURATION...AFTER
DURATION...FROM/TO
SEARCH
The DURATION clause is used in the SELECT statement to set the data retrieval scope as a time reference. The biggest advantage of this DURATION is that it greatly affects SELECT performance because the database narrows the range of data to visit. As mentioned above, Machbase is extremely easy to access data based on specific time because all data is partitioned based on time axis. One important point is that the reference time for this duration is not the user-specified column, but the ‘_arrival_time’ column, which is an internal data type. Therefore, to use Machbase most efficiently, you do not need to define a separate time column, but rather use the internal column ‘_arrival_time’, which is specified at the moment when data is stored in Machbase.
Machbase outputs data in the reverse order. That is from the latest data to old data and all the basic data operations follow this order. However, because it is also common to actually retrieve data from a certain point in the past to future directions, Machbase supports AFTER command. The syntax is defined as follows.
Syntax:
Code Block |
---|
DURATION time_expression [BEFORE time_expression | TO_DATE(time) ];
DURATION time_expression [AFTER TO_DATE(time)];
time_expression
- ALL
- n year
- n month
- n week
- n day
- n hour
- n minute
- n second |
DURATION...BEFORE
As described earlier, if BEFORE is explicitly or omitted, it searches from records in the "reverse order"(i.e., from the current time to the past time direction).
DURATION...AFTER
When AFTER command is explicitly used, it searches data from the past to present. In other words, records will be displayed in forward direction of time. Check the scan direction in the figure below. In the previous section, BEFORE command searches and displays records from the recent to past. While AFTER command searches, it displays data from the past to recent. It is because the time is based on the past when using AFTER and it sounds natural to display data from the old one first.
Example:
...
language | sql |
---|
...
문법
Code Block |
---|
DURATION time_expression [BEFORE time_expression | TO_DATE(time) ];
DURATION time_expression [AFTER TO_DATE(time)];
time_expression
- ALL
- n year
- n month
- n week
- n day
- n hour
- n minute
- n second |
DURATION...BEFORE
앞서 말한 것 처럼, BEFORE를 명시적 이용하거나 정의되지 않은 경우(자동으로 BEFORE를 적용)에는 최근에서 과거 순으로 데이터를 출력한다.
절대 시간 값 또는 상대 시간 값을 기준으로 데이터를 조회할 수 있다.
절대 시간 값 기준 검색
Code Block | ||
---|---|---|
| ||
Mach> CREATE TABLE time_table (id INTEGER); Created successfully. Mach> INSERT INTO time_table(_arrival_time, id) VALUES(TO_DATE('2014-6-12 10:00:00', 'YYYY-MM-DD HH24:MI:SS'), 1); 1 row(s) inserted. Mach> INSERT INTO time_table(_arrival_time, id) VALUES(TO_DATE('2014-6-12 11:00:00', 'YYYY-MM-DD HH24:MI:SS'), 2); 1 row(s) inserted. Mach> INSERT INTO time_table(_arrival_time, id) VALUES(TO_DATE('2014-6-12 12:00:00', 'YYYY-MM-DD HH24:MI:SS'), |
...
3); 1 row(s) inserted. Mach> INSERT INTO |
...
time_table(_arrival_time, id) VALUES(TO_DATE(' |
...
2014-6-12 |
...
13:00:00', 'YYYY-MM-DD HH24:MI:SS'), |
...
4); 1 row(s) inserted. Mach> INSERT INTO |
...
time_table |
...
VALUES(5); 1 row(s) inserted. Mach> |
...
SELECT _arrival_time, * |
...
FROM time_table DURATION 1 MINUTE; _arrival_time ID ----------------------------------------------- 2017-02-16 12:17:01 880:937:028 5 [1] row(s) selected. Mach> SELECT _arrival_time, * FROM time_table DURATION 1 DAY BEFORE TO_DATE('2014-6-12 12:00:00', 'YYYY-MM-DD HH24:MI:SS'); |
...
_arrival_time ID
-----------------------------------------------
|
...
2014-06-12 |
...
12:00:00 000:000:000 |
...
3 |
...
2014-06-12 |
...
11:00:00 000:000:000 |
...
2 |
...
2014-06-12 |
...
10:00:00 000:000:000 |
...
1 [3] row(s) selected. |
...
DURATION...FROM/TO
If a user wants to search data based on two specified absolute times, use "DURATION FROM A TO B" syntax. A and B represent the absolute time values that are represented as TO_DATE(). A and B can have different values based on the users' intention. For example, if A is bigger than B, the scan will be conducted in forward direction, that is, from the recent to past. It is the same direction with BEFORE command. However, if B is bigger than A, the scan will be conducted in reverse direction. That is, it searches from the past to recent and is the same direction with AFTER command.
The absolute times and direction of scans are shown below.
Example:
...
language | sql |
---|
...
상대 시간 값 기준 검색
상대 시간 값을 기준으로 한 검색은, 바로 현재를 기준으로 한 검색으로 볼 수 있다.
Code Block |
---|
Mach> CREATE TABLE relative_table(id INTEGER);
Created successfully.
Mach> INSERT INTO relative_table values(1);
1 row(s) inserted.
------ WAIT for 30 SECONDS before the second value ------
Mach> INSERT INTO relative_table values(2);
1 row(s) inserted.
Mach> SELECT _arrival_time, * FROM relative_table;
_arrival_time ID
-----------------------------------------------
2017-02-16 12:35:34 476:055:014 2
2017-02-16 12:35:04 430:802:356 1
[2] row(s) selected.
Mach> SELECT id FROM relative_table DURATION 30 second ;
id
--------------
2
[1] row(s) selected.
Mach> SELECT id FROM relative_table DURATION 60 second ;
id
--------------
2
1
[2] row(s) selected.
Mach> SELECT id FROM relative_table DURATION 30 second BEFORE 30 second;
id
--------------
1
[1] row(s) selected. |
DURATION...AFTER
AFTER를 적용한 경우, 데이터는 과거에서 최근순으로 출력된다.
BEFORE명령은, 최근에서 과거로 출력하는것에 비교하면 데이터가 입력 시간을 기준으로 자동으로 역순으로 출력된다.
Code Block | ||
---|---|---|
| ||
Mach> CREATE TABLE after_table (id INTEGER); Created successfully. Mach> INSERT INTO after_table(_arrival_time, id) VALUES(TO_DATE('2016-6-12 |
...
10:00:00', 'YYYY-MM-DD HH24:MI:SS'), |
...
1); 1 row(s) inserted. Mach> INSERT INTO |
...
after_table(_arrival_time, id) VALUES(TO_DATE('2016-6-12 |
...
11:00:00', 'YYYY-MM-DD HH24:MI:SS'), |
...
2); |
...
|
...
Mach> INSERT INTO |
...
after_table(_arrival_time, id) VALUES(TO_DATE('2016-6-12 |
...
12:00:00', 'YYYY-MM-DD HH24:MI:SS'), |
...
3); 1 row(s) inserted. Mach> INSERT INTO |
...
after_table(_arrival_time, id) VALUES(TO_DATE('2016-6-12 |
...
13:00:00', 'YYYY-MM-DD HH24:MI:SS'), |
...
4); 1 row(s) inserted. Mach> INSERT |
...
INTO after_table(_arrival_time, |
...
id) VALUES(TO_DATE('2016-6-12 |
...
14:00:00', 'YYYY-MM-DD HH24:MI:SS'), |
...
5); 1 row(s) inserted. Mach> select _arrival_time, * from after_table duration ALL after TO_DATE('2016-6-12 11:00:00', 'YYYY-MM-DD HH24:MI:SS'); _arrival_time ID ----------------------------------------------- 2016-06-12 11:00:00 000:000:000 2 2016-06-12 12:00:00 000:000:000 3 2016-06-12 13:00:00 000:000:000 4 2016-06-12 14:00:00 000:000:000 5 [ |
...
4] row(s) selected. Mach> |
...
select _arrival_time, * |
...
from |
...
after_table |
...
duration |
...
ALL |
...
before |
...
TO_DATE('2016-6-12 |
...
13:00:00', 'YYYY-MM-DD HH24:MI:SS') |
...
;
_arrival_time ID
-----------------------------------------------
2016-06-12 |
...
13:00:00 000:000:000 |
...
4 2016-06-12 |
...
12:00:00 000:000:000 |
...
3
2016-06-12 11:00:00 000:000:000 2
2016-06-12 10:00:00 000:000:000 1
[4] row(s) selected. |
DURATION...FROM/TO
사용자가 두개의 절대 시간을 기준으로 데이터를 검색하려고 할 때, "DURATION FROM A TO B" 형태의 조건절을 이용한다.
A와 B는 절대적 시간이며 TO_DATE함수를 이용하여 표현된다. A와 B는 사용자의 의도에 따라 다르게 설정될 수 있다. 예를 들어,
- A가 B보다 이후의 시간일 경우 BEFORE를 사용한 것과 같이, 검색 방향은 최근에서 과거 순으로 데이터를 출력한다.
- B가 A보다 과거인 경우 AFTER를 사용한 것과 같이, 검색 방향은 과거에서 최근 순으로 데이터를 출력한다.
아래의 예제를 보면 데이터의 출력 방식을 쉽게 이해할 수 있다.
Code Block | ||
---|---|---|
| ||
Mach> CREATE TABLE from_table (id INTEGER); Created successfully. Mach> INSERT INTO from_table(_arrival_time, id) VALUES(TO_DATE('2016-6-12 |
...
10:00:00', |
...
'YYYY-MM-DD HH24:MI:SS'), 1); |
...
1 row(s) inserted. Mach> INSERT INTO from_table(_arrival_time, id) VALUES(TO_DATE('2016-6-12 11:00:00', 'YYYY-MM-DD HH24:MI:SS'), 2); 1 row(s) inserted. Mach> INSERT INTO from_table(_arrival_time, id) VALUES(TO_DATE('2016-6-12 12:00:00', 'YYYY-MM-DD HH24:MI:SS'), 3); 1 row(s) |
...
inserted. Mach> |
...
INSERT INTO from_table(_arrival_time, id) VALUES(TO_DATE('2016-6-12 13:00:00', 'YYYY-MM-DD HH24:MI:SS'), 4); |
...
1 row(s) inserted. Mach> INSERT |
...
INTO from_table(_arrival_time, id) VALUES(TO_DATE('2016-6-12 14:00:00', 'YYYY-MM-DD HH24:MI:SS'), 5); 1 row(s) inserted. Mach> INSERT INTO from_table(_arrival_time, id) VALUES(TO_DATE('2016-6-12 15:00:00', 'YYYY-MM-DD HH24:MI:SS'), 6); 1 row(s) |
...
inserted. Mach> SELECT _arrival_time, * |
...
FROM from_table |
...
DURATION FROM TO_DATE('2016-6-12 |
...
12:00:00', 'YYYY-MM-DD HH24:MI:SS') TO TO_DATE(' |
...
2016-6-12 |
...
14:00:00', 'YYYY-MM-DD HH24:MI:SS'); _arrival_time ID ----------------------------------------------- 2016-06-12 |
...
12:00:00 000:000:000 |
...
3 2016-06-12 |
...
13:00:00 000:000:000 |
...
4 2016-06-12 |
...
14:00:00 000:000:000 |
...
5 [3] row(s) selected. Mach> SELECT _arrival_time, * |
...
FROM from_table |
...
limit 2 DURATION FROM TO_DATE(' |
...
2016-6-12 |
...
12:00:00', 'YYYY-MM-DD HH24:MI:SS') TO TO_DATE('2016-6-12 |
...
15:00:00', 'YYYY-MM-DD HH24:MI:SS'); _arrival_time |
...
ID ----------------------------------------------- 2016-06-12 12:00:00 000:000:000 3 2016- |
...
06-12 13:00:00 000:000:000 4 [2] row(s) selected. Mach> SELECT _arrival_time, * FROM from_table DURATION FROM TO_DATE('2016-6-12 15:00:00 |
...
', 'YYYY-MM-DD HH24:MI:SS') TO TO_DATE('2016-6-12 12:00:00 |
...
SEARCH
Search Based on Absolute Time
Example:
...
language | sql |
---|
...
', 'YYYY-MM-DD HH24:MI:SS'); _arrival_time ID ----------------------------------------------- 2016-06-12 15:00:00 000:000:000 6 2016-06-12 14:00:00 000:000:000 5 2016-06-12 13:00:00 000:000:000 4 2016-06-12 12:00:00 |
...
000:000:000 3 [4] row(s) |
...
selected. Mach> |
...
SELECT _arrival_time, * FROM from_table LIMIT 2 duration FROM TO_DATE(' |
...
2016-6-12 |
...
15:00:00', 'YYYY-MM-DD HH24:MI:SS |
...
') TO TO_DATE('2016-6-12 12:00:00', 'YYYY-MM-DD HH24:MI:SS'); _arrival_time ID ----------------------------------------------- |
...
2016-06-12 15:00:00 000:000:000 6 2016-06-12 14:00:00 000:000:000 5 [ |
...
2] row(s) selected. Mach> SELECT _arrival_time, * from from_table duration FROM |
...
TO_DATE('2016-6-12 13:00:00', 'YYYY-MM-DD HH24:MI:SS') TO TO_DATE(' |
...
2016-6-12 |
...
13:00:00', 'YYYY-MM-DD HH24:MI:SS'); _arrival_time ID ----------------------------------------------- |
...
2016-06-12 |
...
13:00:00 000:000:000 |
...
Search Based on Relative Time
Example:
...
4 [1] row(s) selected. Mach> SELECT _arrival_time, * from from_table duration FROM TO_DATE('2016-6-12 13:00:00', 'YYYY-MM-DD HH24:MI:SS') TO TO_DATE('2016-6-12 20:00:00', 'YYYY-MM-DD HH24:MI:SS'); _arrival_time ID ----------------------------------------------- 2016-06-12 13:00:00 000:000:000 4 2016-06-12 14:00:00 000:000:000 5 2016-06-12 15:00:00 000:000:000 6 [3] row(s) selected. Mach> SELECT _arrival_time, * from from_table duration FROM TO_DATE('2016-6-12 20:00:00', 'YYYY-MM-DD HH24:MI:SS') TO TO_DATE('2016-6-12 13:00:00', 'YYYY-MM-DD HH24:MI:SS'); _arrival_time ID ------------------------ |
...
----------------------- 2016-06-12 15:00:00 000:000:000 6 2016-06- |
...
12 14:00:00 000:000:000 5 2016-06-12 13:00:00 000:000:000 4 [3] row(s) selected. |