Cộng và trừ dữ liệu ngày giờ

Phân tích chuỗi thời gian trong PostgreSQL

Jasmin Ludolf

Content Developer, DataCamp

Chênh lệch thời gian

  • AGE() : trừ đối số thứ hai khỏi đối số thứ nhất hoặc khỏi ngày hiện tại
  • AGE(timestamp, timestamp) hoặc AGE(timestamp)
SELECT
AGE('2018-01-02','2017-01-01') AS "2017",
AGE('2021-01-05','2020-01-01') AS "2020";
|2017        |2020         |
|------------|-------------|
|1 year 1 day|1 year 4 days|
Phân tích chuỗi thời gian trong PostgreSQL

Diễn giải sai chênh lệch

SELECT 
AGE('2017-12-31','2017-01-01') AS "2017",
AGE('2018-12-31','2018-01-01') AS "2018",
AGE('2019-12-31','2019-01-01') AS "2019",
AGE('2020-12-31','2020-01-01') AS "2020";
|2017           |2018           |2019           |2020           |
|---------------|---------------|---------------|---------------|
|11 mons 30 days|11 mons 30 days|11 mons 30 days|11 mons 30 days|
Phân tích chuỗi thời gian trong PostgreSQL

Toán tử trừ

SELECT
'2018-01-01'::DATE - '2017-01-01'::DATE AS "2017",
'2019-01-01'::DATE - '2018-01-01'::DATE AS "2018",
'2020-01-01'::DATE - '2019-01-01'::DATE AS "2019",
'2021-01-01'::DATE - '2020-01-01'::DATE AS "2020";
|2017|2018|2019|2020|
|----|----|----|----|
| 365| 365| 365| 366|
Phân tích chuỗi thời gian trong PostgreSQL

Dùng toán tử trừ

  • - : toán tử trừ
  • Trả về kiểu dữ liệu INTERVAL
  • INTERVAL cho phép lưu và xử lý một khoảng thời gian
SELECT
    '2021-01-01 00:03:00'::TIMESTAMP - '2021-01-01 00:01:30'::TIMESTAMP 
    AS interval;
|interval|
|--------|
|00:01:30|
Phân tích chuỗi thời gian trong PostgreSQL

Khoảng thời gian

WITH line_324 AS (
    SELECT station, arrival_time 
    FROM train_schedule 
    WHERE train_id=324 )
SELECT hillsdale.arrival_time - millbrae.arrival_time AS diff
FROM line_324 AS millbrae, line_324 AS hillsdale
WHERE millbrae.station='Millbrae' 
AND hillsdale.station='Hillsdale';
  • CTE: Common Table Expression, định nghĩa bảng tạm cho một truy vấn
1 https://www.caltrain.com/schedules/weekdaytimetable.html
Phân tích chuỗi thời gian trong PostgreSQL

Khoảng thời gian

WITH line_324 AS (
    SELECT station, arrival_time 
    FROM train_schedule 
    WHERE train_id=324 )
SELECT hillsdale.arrival_time - millbrae.arrival_time AS diff
FROM line_324 AS millbrae, line_324 AS hillsdale
WHERE millbrae.station='Millbrae' 
AND hillsdale.station='Hillsdale';
|diff    |
|--------|
|00:08:00|
1 https://www.caltrain.com/schedules/weekdaytimetable.html
Phân tích chuỗi thời gian trong PostgreSQL

Trừ một khoảng thời gian

SELECT 
    '2020-02-01'::DATE - INTERVAL '1 month' AS "1 month sooner";
|1 month sooner     |
|-------------------|
|2020-01-01 00:00:00|
Phân tích chuỗi thời gian trong PostgreSQL

Đổi một khoảng thời gian sang đơn vị chỉ định

  • EXTRACT(epoch FROM start_time - end_time)
SELECT EXTRACT(epoch FROM
    ('2021-01-01 00:03:00'::TIMESTAMP - '2021-01-01 00:01:30'::TIMESTAMP))

AS seconds;
|seconds|
|-------|
|   90.0|
Phân tích chuỗi thời gian trong PostgreSQL

Đổi một khoảng thời gian sang đơn vị chỉ định

SELECT (EXTRACT(epoch FROM
    ('2021-01-01 00:01:00'::TIMESTAMP - '2020-12-31 23:59:30'::TIMESTAMP)))
    / 60 AS minutes;
|minutes|
|-------|
|    1.5|
Phân tích chuỗi thời gian trong PostgreSQL

Cộng thời gian

SELECT '2019-02-01'::DATE + INTERVAL '28 days' AS "28 days later";
|28 days later      |
|-------------------|
|2019-03-01 00:00:00|
SELECT '2020-02-01'::DATE + INTERVAL '28 days' AS "28 days later";
|28 days later      |
|-------------------|
|2020-02-29 00:00:00|
Phân tích chuỗi thời gian trong PostgreSQL

Cộng 1 tháng vào ngày

SELECT '2019-02-01'::DATE + INTERVAL '1 month' AS "1 month later";
|1 month later      |
|-------------------|
|2019-03-01 00:00:00|
SELECT '2020-02-01'::DATE + INTERVAL '1 month' AS "1 month later";
|1 month later      |
|-------------------|
|2020-03-01 00:00:00|
Phân tích chuỗi thời gian trong PostgreSQL

Ayo berlatih!

Phân tích chuỗi thời gian trong PostgreSQL

Preparing Video For Download...