Trong PostgreSQL, now()
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 transaction_timestamp()
chức năng.
Nó cũng tương tự như current_timestamp
hàm (khi được gọi mà không có đối số).
now()
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, now()
không phải là chuẩn SQL (cũng như transaction_timestamp()
chức năng).
Cú pháp
Cú pháp như sau:
now()
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 now();
Kết quả:
2020-07-02 09:51:12.088506+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 now();
SELECT pg_sleep(5);
SELECT now();
SELECT pg_sleep(5);
SELECT now();
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 now(); now ------------------------------- 2020-07-02 09:51:53.905091+10 (1 row) postgres=# SELECT pg_sleep(5); pg_sleep ---------- (1 row) postgres=# SELECT now(); now ------------------------------- 2020-07-02 09:51:53.905091+10 (1 row) postgres=# SELECT pg_sleep(5); pg_sleep ---------- (1 row) postgres=# SELECT now(); now ------------------------------- 2020-07-02 09:51:53.905091+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 tới now()
, 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
now(),
pg_sleep(5),
now(),
pg_sleep(5),
now();
Kết quả (sử dụng đầu ra dọc):
now | 2020-07-02 09:53:33.766806+10 pg_sleep | now | 2020-07-02 09:53:33.766806+10 pg_sleep | now | 2020-07-02 09:53:33.766806+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 tới now()
.
Đ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).