2010-03-30 35 views
6

Một bảng có cột dấu thời gian. Giá trị mẫu trong đó có thể là 2010-03-30 13:42:42. Với Hibernate, tôi đang thực hiện một truy vấn phạm vi Restrictions.between ("column-name", fromDate, toDate).Truy vấn ngày với Hibernate trên cột dấu thời gian trong PostgreSQL

Ánh xạ Hibernate cho cột này như sau.

<property name="orderTimestamp" column="order_timestamp" type="java.util.Date" /> 

Giả sử, tôi muốn tìm hiểu tất cả các bản ghi có ngày 30 tháng 3 năm 2010 và ngày 31 tháng 3 năm 2010. Truy vấn phạm vi trên trường này được thực hiện như sau.

Date fromDate = new SimpleDateFormat("yyyy-MM-dd").parse("2010-03-30"); 
Date toDate = new SimpleDateFormat("yyyy-MM-dd").parse("2008-03-31"); 
Expression.between("orderTimestamp", fromDate, toDate); 

Điều này không hiệu quả.

Truy vấn được chuyển đổi thành dấu thời gian tương ứng là "2010-03-30 00:00:00" và "2010-03-31 00:00:00". Vì vậy, tất cả các hồ sơ cho ngày 31 tháng 3 năm 2010 đều bị bỏ qua.

Một giải pháp đơn giản cho vấn đề này có thể là có ngày kết thúc là "2010-03-31 23:59:59." Nhưng, tôi muốn biết nếu có cách nào chỉ khớp với phần ngày của cột dấu thời gian.

Ngoài ra, là Expression.between() có bao gồm cả hai giới hạn không? Tài liệu không ném bất kỳ ánh sáng nào về điều này.

+0

Tôi tin rằng giữa hai lần luôn độc quyền trên cả hai giới hạn. Tại sao bạn không loại bỏ 1 mili giây và thêm 1 mili giây cho mỗi người trong số họ? – jishi

+3

@jishi nó phụ thuộc vào cơ sở dữ liệu (và phần lớn thời gian tôi tin). –

+0

Shashikant bạn có thể giải quyết vấn đề này không? – changeme

Trả lời

0

Có thể bạn có thể CAST orderTimestamp vào DATE. HQL does have support cho việc này.

1

"2010-03-31 23:59:59." điều kiện biên có thể nguy hiểm: nếu có giao dịch trong hệ thống từ 23:59:59 đến 00:00:00, bạn sẽ bỏ lỡ nó. Nếu bạn có đủ giao dịch hàng ngày và một khoảng thời gian đủ dài, một báo cáo sẽ bị phá vỡ và bạn sẽ dành hàng giờ để tìm hiểu lý do.

PostgreSQL betweenincludes the limits vì vậy sẽ không an toàn để đặt ngày kết thúc thành 2010-04-01 00:00:00. Sử dụng lt() và gt() để chắc chắn.

+0

vẫn không thể bay, sẽ bao gồm 2010-04-01 00:00 AM –

+0

Sử dụng lt ("endDate", endDate) trong đó endDate = "2010-04-01 00:00" sẽ bao gồm các bản ghi có ngày kết thúc 2010 -04-01 00:00? Tôi không nghĩ vậy. –

+0

Cảm ơn bạn đã liên kết 'between' được bao gồm cho PostgreSQL. Điều kiện ranh giới không phải là điều đáng lo ngại vì dấu thời gian chỉ được ghi lại với độ chính xác của giây. Để sử dụng, nhỏ hơn hoặc lớn hơn, tôi cần sử dụng ít hơn ("2010-04-01 00:00:00") và lớn hơn hoặc bằng - ("2010-03-30 00 : 00: 00 ") –

3

, tôi muốn biết liệu có cách nào chỉ khớp với phần ngày của cột dấu thời gian hay không.

Nếu bạn không muốn có dấu thời gian, hãy sử dụng NGÀY (và bạn không nên sử dụng type="date"?).

Ngoài ra, Expression.between() có bao gồm cả hai giới hạn không?

Dường như hành vi của toán tử SQL GIỮA là database dependent. Với PosgresQL, các GIỮA biểu:

x BETWEEN y AND z 

là ngữ nghĩa tương đương với:

y <= x AND x <= z 

ví dụ bao gồm.

+0

type =" date "không trợ giúp. Bạn muốn thử ý tưởng chú thích trước đó của mình, nhưng thật không may, tôi đang sử dụng phiên bản Hibernate cũ hơn 3.3 trong đó chú thích đã được giới thiệu. –

+0

@Shashikant Tôi đăng câu trả lời của tôi một chút quá nhanh, không nhận ra bạn đang sử dụng ánh xạ xml (do đó cập nhật). Nhưng quả thực, chú thích Hibernate có chú giải @Temporal cho điều này (http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e342). Phải có một số loại tương đương với xml ... Bạn có kiểm soát trên mô hình vật lý của bạn BTW? –

+0

Ngoại trừ giản đồ DB (tức là cột dấu thời gian) và phiên bản Hibernate, tôi có thể thay đổi mọi thứ khác. Chú thích tạm thời có vẻ hữu ích nhưng như tôi đã đề cập, tôi không thể chuyển sang Hibernate 3.3+. Ngoài ra, nếu tôi thêm thời gian Annoation tạm thời là ngày, trong khi truy xuất hàng, nó sẽ cắt ngắn dấu thời gian cho đến nay? Nếu có, điều đó là không mong muốn. Cảm ơn sự giúp đỡ, Pascal. Modding +1. –

0

Sử dụng phép đúc (ngày của bạn, ngày), hãy nhớ arg thứ hai của hàm truyền phải thấp hơn hoặc không hoạt động.

Att .: Samuel \ Maycon

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