Không có sự khác biệt. Ba trích dẫn từ hướng dẫn:
1)
Các hàm tiêu chuẩn SQL này đều trả về các giá trị dựa trên thời gian bắt đầu của giao dịch hiện tại:
...
...
CURRENT_TIMESTAMP
2)
transaction_timestamp()
tương đương với CURRENT_TIMESTAMP
, nhưng được đặt tên để phản ánh rõ ràng những gì nó trả về.
3)
now()
là một PostgreSQL truyền thống tương đương với transaction_timestamp()
.
Nhấn mạnh đậm của tôi. CURRENT_TIMESTAMP
, transaction_timestamp()
và now()
làm chính xác như vậy. CURRENT_TIMESTAMP
là một số lẻ cú pháp cho một hàm, không có cặp dấu ngoặc đơn. Đó là theo tiêu chuẩn SQL.
Nếu bạn không khai báo bí danh cột cho lệnh gọi hàm trong câu lệnh SQL, thì bí danh sẽ mặc định là tên của hàm. Trong nội bộ, SQL tiêu chuẩn CURRENT_TIMESTAMP
được triển khai với now()
. Lên đến Postgres 9.6 hiển thị trong tên cột kết quả là "bây giờ", nhưng đã thay đổi thành "current_timestamp" trong Postgres 10.
transaction_timestamp()
cũng làm như vậy, nhưng cái này là một hàm Postgres thích hợp, vì vậy bí danh mặc định luôn là "Transaction_timestamp".
Đừng không nhầm lẫn giữa một trong những chức năng với đặc biệt liên tục đầu vào'now'
. Đó chỉ là một trong một số cách viết tắt công chứng cho các giá trị ngày / thời gian / dấu thời gian cụ thể, trích dẫn hướng dẫn:
... sẽ được chuyển đổi thành giá trị ngày / giờ thông thường khi đọc. (Cụ thể now
và các chuỗi liên quan được chuyển đổi thành giá trị thời gian cụ thể ngay khi chúng được đọc.) Tất cả các giá trị này cần được đặt trong dấu ngoặc đơn khi được sử dụng làm hằng số trong các lệnh SQL.
Nó có thể thêm vào sự nhầm lẫn rằng (tối thiểu Postgres 12) bất kỳ số lượng khoảng trắng và dấu ngoặc (và dấu đầu dòng {[( )]}
) nào được cắt bớt từ các giá trị đầu vào đặc biệt đó. Vì vậy 'now()'::timestamptz
- hoặc chỉ 'now()'
khi không yêu cầu phân loại kiểu rõ ràng - cũng hợp lệ và xảy ra để đánh giá cùng dấu thời gian như hàm now()
trong hầu hết các ngữ cảnh . Nhưng đó là các hằng số và thường không phải là những gì bạn muốn làm mặc định cột chẳng hạn.
db <> fiddle ở đây Fiddle SQL
cũ
Các lựa chọn thay thế đáng chú ý là statement_timestamp()
và clock_timestamp()
. Hướng dẫn sử dụng:
statement_timestamp()
trả về thời gian bắt đầu của câu lệnh hiện tại (cụ thể hơn là thời gian nhận thông báo lệnh mới nhất từ máy khách). [...]
clock_timestamp()
trả về thời gian hiện tại thực tế và do đó giá trị của nó thay đổi ngay cả trong một lệnh SQL.
Lưu ý: statement_timestamp()
là STABLE
như trên (luôn trả về cùng một giá trị trong cùng một lệnh SQL). Nhưng clock_timestamp()
nhất thiết là chỉ VOLATILE
. Sự khác biệt có thể là đáng kể.
where items.createddate > now()
?