2013-04-04 46 views
7

Tôi là nhà phát triển SQL và dành phần lớn thời gian của tôi trong MSSQL. Tôi đang tìm kiếm một cách tốt hơn để lọc một lĩnh vực "Dấu thời gian mà không cần múi giờ" trong một PostgreSQL DBPostgreSQL- Lọc phạm vi ngày

Tôi đang sử dụng:

Where 
DateField >= '2010-01-01' and 
DateField < '2012-01-01' 

Nhưng cho rằng tôi không phải là một chuyên gia tại các cú pháp tôi phải nghĩ rằng có một cách tốt hơn.

Đề xuất? Cảm ơn.

+1

Có vấn đề gì với điều đó? Bạn có thể sử dụng 'giữa 2010-01-01' và 2012-01-01', nhưng nó gần như giống nhau, thực sự. Có cách nào tốt hơn để làm điều này với MSSQL (tôi chưa bao giờ sử dụng nó)? – Andre

+1

@Andre Tốt hơn là chỉ định rõ định dạng ngày. –

+0

Nó ổn, nó chỉ chạy dài. Tôi đảm bảo có một chỉ mục trên sân, nhưng nó chỉ mất nhiều thời gian hơn tôi thường làm. –

Trả lời

17

Giải pháp của bạn là tốt. Nếu ngày là literals, tôi muốn, mặc dù:

WHERE datefield >= '2010-01-01 00:00:00' 
AND datefield < '2012-01-01 00:00:00' 

này thực hiện giống hệt nhau, nhưng là maintenable hơn, bởi vì nó làm cho rõ ràng quan điểm của mỗi "ngày" đen trở thành một dấu thời gian, không phải là một ngày . Ví dụ, giả đôi khi có người thay đổi truy vấn của bạn như sau

AND datefield <= '2012-01-01' 

... mong đợi (và thất bại) để bao gồm cả ngày "2012/01/01" trong truy vấn. Với cú pháp sau, ý định rõ ràng hơn và sự nhầm lẫn này được ngăn chặn.

Để làm cho nó thậm chí còn rõ ràng hơn (có lẽ quá dài dòng), bạn có thể làm 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ự (tiềm năng datatype nhầm lẫn), cũng không phải to_timestamp() (nó trả về một số timestamptz).

BTW, tôi đã sửa đổi trường hợp để tuân thủ thực tiễn được khuyến nghị (từ khóa viết hoa, số nhận dạng thường)

+2

Bạn có thể sử dụng GIỮA nếu bạn sử dụng - ví dụ của bạn-- '2010-01-01 00:00:00' :: dấu thời gian làm ngày bắt đầu và '2010-01-01 24:00:00': : dấu thời gian là kết thúc. – thisfeller

4

Đối với khoảng cách ngày bạn có thể sử dụng một cái gì đó như:

WHERE DateField BETWEEN to_date('2010-01-01','YYYY-MM-DD') 
        AND to_date('2010-01-02','YYYY-MM-DD') 

Nó là ngắn hơn (bạn không cần phải lặp lại DateField), và có định dạng ngày tháng rõ ràng.

Đối với 1 giờ/ngày/tháng/năm bạn có thể sử dụng:

WHERE date_trunc('day',DateField) = to_date('2010-01-01','YYYY-MM-DD') 
+0

'between' không giống với'> = và <'vì nó bao gồm cả hai đầu. –

+2

@ClodoaldoNeto Đối với dấu thời gian (như đã đề cập trong câu hỏi), chênh lệch là một phần nghìn giây. –

Các vấn đề liên quan