Nhờ độ phân giải loại chức năng chúng ta cũng có thể chuyển date
giá trị của generate_series()
bởi vì có một ẩn ý truyền từ date
đến timestamp
cũng như từ date
đến timestamptz
. Sẽ không rõ ràng, nhưng timestamptz
là "ưu tiên" trong số "Loại ngày / giờ". Giải thích chi tiết:
- Tạo chuỗi thời gian giữa hai ngày trong PostgreSQL
Đối với một date
trống rỗng giờ địa phương 00:00
được đảm nhận trong dàn diễn viên. Lưu ý rằng cài đặt múi giờ hiện tại ảnh hưởng trực tiếp đến kết quả nếu bạn sử dụng date
là đầu vào vì rõ ràng là '2014-01-10 00:00' đại diện cho một thời điểm ở Tokio khác với ở New York.
Làm cách nào để Postgres quyết định loại nào được chấp nhận?
Về cơ bản, Postgres phân biệt giữa ba loại phôi:
Explicit casts
.. khi sử dụng CAST
hoặc ::
cú pháp.
Assignment cast
.. ép kiểu ngầm định khi một giá trị được gán cho một cột đích.
Implicit cast
.. ẩn trong tất cả các biểu thức khác.
Phải có một ẩn ý ép kiểu đã đăng ký trong hệ thống từ kiểu đầu vào sang kiểu mong đợi để làm cho một hàm âm thầm chấp nhận (và chuyển đổi) một giá trị đầu vào.
Để xem phôi nào được xác định thành timestamptz
, bạn có thể truy vấn bảng danh mục pg_cast
:
SELECT castsource::regtype, casttarget::regtype, castcontext
FROM pg_cast
WHERE casttarget = 'timestamptz'::regtype;
castsource | casttarget | castcontext
-----------------------------+--------------------------+-------------
abstime | timestamp with time zone | i
date | timestamp with time zone | i
timestamp without time zone | timestamp with time zone | i
timestamp with time zone | timestamp with time zone | i
Tất cả các diễn viên này đều là ẩn ý . Theo tài liệu về castcontext
:
Cho biết ngữ cảnh mà dàn diễn viên có thể được gọi trong.
e
chỉ có nghĩa là truyền không rõ ràng (sử dụngCAST
hoặc::
cú pháp).a
có nghĩa là không gán một cách hoàn toàn cho cột mục tiêu, cũng như một cách rõ ràng.i
nghĩa một cách rõ ràng trong các biểu thức, cũng như các trường hợp khác.
Nhấn mạnh đậm của tôi.