Biểu diễn chuỗi của timestamp
(=timestamp without time zone
) tùy thuộc vào cài đặt ngôn ngữ của bạn. Do đó, để tránh sự mơ hồ dẫn đến lỗi dữ liệu hoặc Postgres đưa ra một ngoại lệ, bạn có hai lựa chọn:
1.) Sử dụng định dạng ISO 8601 , hoạt động tương tự với bất kỳ ngôn ngữ hoặc DateStyle
cài đặt:
'2013-08-20 14:52:49'
Bạn có thể phải ép kiểu chuỗi theo nghĩa đen một cách rõ ràng trong đó kiểu dữ liệu không thể được lấy từ ngữ cảnh, tùy thuộc vào trường hợp sử dụng:
'2013-08-20 14:52:49'::timestamp
2.) Chuyển đổi chuỗi thành timestamp
sử dụng to_timestamp()
với một mẫu mẫu phù hợp:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')
Điều này trả về timestamptz
, giả sử cài đặt múi giờ hiện tại. Thông thường (như trong một nhiệm vụ), loại được ép buộc tương ứng. Đối với timestamp
, điều này có nghĩa là khoảng thời gian bù đắp được cắt ngắn và bạn nhận được giá trị mong đợi. Ngoài ra, nếu loại đích không thể bắt nguồn từ ngữ cảnh, bạn có thể phải truyền một cách rõ ràng:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')::timestamp
Vì điều đó chỉ đơn giản là loại bỏ khoảng thời gian bù đắp, nó dẫn đến giá trị mong đợi. Hoặc sử dụng AT TIME ZONE
xây dựng với múi giờ bạn chọn:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss') AT TIME ZONE 'UTC'
Mặc dù múi giờ mục tiêu giống với timezone
hiện tại của bạn thiết lập, không có chuyển đổi diễn ra. Nếu không, dấu thời gian kết quả được chuyển đổi tương ứng. Đọc thêm:
- Bỏ qua hoàn toàn các múi giờ trong Rails và PostgreSQL