Giải pháp của bạn là tốt. Tuy nhiên, nếu ngày tháng là chữ, tôi muốn:
WHERE datefield >= '2010-01-01 00:00:00'
AND datefield < '2012-01-01 00:00:00'
Điều này hoạt động hoàn toàn giống nhau, nhưng dễ bảo trì hơn, bởi vì nó làm rõ quan điểm của mỗi "ngày" theo nghĩa đen là một dấu thời gian, không phải là một ngày. Ví dụ:giả sử đôi khi ai đó thay đổi truy vấn của bạn thành như sau
AND datefield <= '2012-01-01'
... mong đợi (và không thành công) đưa cả ngày "2012-01-01" vào truy vấn. Với cú pháp muộn hơn, ý định rõ ràng hơn và sự nhầm lẫn này được ngăn chặn.
Để làm cho nó rõ ràng hơn (có lẽ quá dài dòng), bạn có thể thực hiện diễn viên rõ ràng:
WHERE datefield >= '2010-01-01 00:00:00'::timestamp
AND datefield < '2012-01-01 00:00:00'::timestamp
Tôi sẽ không sử dụng to_date()
ở đây vì những lý do tương tự (có thể nhầm lẫn kiểu dữ liệu), cũng không phải to_timestamp()
(nó trả về một timestamptz
).
BTW, tôi đã sửa đổi trường hợp để tuân thủ thông lệ được khuyến nghị (từ khóa ở dạng chữ hoa, số nhận dạng ở dạng chữ thường)