Trong PostgreSQL, transaction_timestamp()
hàm trả về ngày và giờ hiện tại (bao gồm cả độ lệch múi giờ), khi bắt đầu giao dịch hiện tại.
Nó tương đương với hàm Postgres truyền thống now()
.
Nó cũng tương tự như current_timestamp
hàm (khi được gọi mà không có đối số), ngoại trừ việc nó được đặt tên để phản ánh rõ ràng chức năng của nó.
transaction_timestamp()
hàm không chấp nhận bất kỳ tham số nào, vì vậy bạn không thể chỉ định độ chính xác của nó, trong khi current_timestamp
có thể được gọi có hoặc không có tham số chính xác.
Ngoài ra, transaction_timestamp()
là một hàm không phải chuẩn SQL.
Cú pháp
Cú pháp như sau:
transaction_timestamp()
Không có đối số nào được yêu cầu hoặc chấp nhận.
Ví dụ cơ bản
Đây là một ví dụ cơ bản để chứng minh.
SELECT transaction_timestamp();
Kết quả:
2020-07-02 08:23:08.810484+10
Trong một giao dịch
Dưới đây là một ví dụ để chứng minh cách nó hoạt động trong một giao dịch.
BEGIN;
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
COMMIT;
Đây là đầu ra đầy đủ trong thiết bị đầu cuối của tôi khi sử dụng psql:
postgres=# BEGIN; BEGIN postgres=# SELECT transaction_timestamp(); transaction_timestamp ------------------------------- 2020-07-02 08:27:04.229266+10 (1 row) postgres=# SELECT pg_sleep(5); pg_sleep ---------- (1 row) postgres=# SELECT transaction_timestamp(); transaction_timestamp ------------------------------- 2020-07-02 08:27:04.229266+10 (1 row) postgres=# SELECT pg_sleep(5); pg_sleep ---------- (1 row) postgres=# SELECT transaction_timestamp(); transaction_timestamp ------------------------------- 2020-07-02 08:27:04.229266+10 (1 row) postgres=# COMMIT; COMMIT
Cả ba giá trị thời gian đều giống hệt nhau, mặc dù pg_sleep()
hàm được sử dụng để trì hoãn việc thực thi giữa mỗi lần gọi đến transaction_timestamp()
, mỗi câu lệnh trong số đó đều nằm trong câu lệnh SQL của riêng nó.
Vì vậy, chúng ta có thể thấy rằng thời gian trả về cho mỗi câu lệnh dựa trên thời gian bắt đầu của giao dịch hiện tại - không phải câu lệnh. Nó không thay đổi khi giao dịch tiến triển.
Điều này cho phép một giao dịch duy nhất có khái niệm nhất quán về thời gian “hiện tại”, do đó, nhiều sửa đổi trong cùng một giao dịch có cùng dấu thời gian.
Nhiều cuộc gọi trong một câu lệnh
Nó cũng không thay đổi khi câu lệnh diễn ra.
\x
SELECT
transaction_timestamp(),
pg_sleep(5),
transaction_timestamp(),
pg_sleep(5),
transaction_timestamp();
Kết quả (sử dụng đầu ra dọc):
transaction_timestamp | 2020-07-02 09:15:56.154175+10 pg_sleep | transaction_timestamp | 2020-07-02 09:15:56.154175+10 pg_sleep | transaction_timestamp | 2020-07-02 09:15:56.154175+10
Một lần nữa, cả ba giá trị thời gian đều giống hệt nhau, mặc dù pg_sleep()
hàm được sử dụng để trì hoãn việc thực thi giữa mỗi lần gọi đến transaction_timestamp()
.
Điều này trái ngược với statement_timestamp()
, mà hiện thay đổi theo từng câu lệnh và cả clock_timestamp()
hàm, thay đổi ngay cả khi nó tiến triển qua mỗi câu lệnh (nếu được gọi nhiều lần trong câu lệnh).