2010-08-30 55 views
5

Tôi đang lấy một số dữ liệu từ cơ sở dữ liệu có giá trị ngày được lưu trữ và tôi cho phép người dùng chọn phạm vi ngày mà họ muốn xem dữ liệu. Tất cả mã của tôi để nhận các phạm vi ngày này hoạt động ngoại trừ phương pháp để có phạm vi ngày bao gồm mọi thời gian, đây sẽ là giá trị bắt đầu của dữ liệu Java có thể sớm nhất xử lý, đến giá trị cuối cùng của ngày có thể tối đa.Java: Phạm vi ngày tối thiểu và tối thiểu

Có điều gì sai với mã của tôi, bởi vì tôi không thể nhìn thấy một vấn đề:

public static DateRange getAllTime() { 
     /** 
     * Get earliest possible 
     */ 
     Calendar c = Calendar.getInstance(); 
     c.set(
       c.getActualMinimum(Calendar.YEAR), 
       c.getActualMinimum(Calendar.MONTH), 
       c.getActualMinimum(Calendar.DAY_OF_MONTH), 
       c.getActualMinimum(Calendar.HOUR), 
       c.getActualMinimum(Calendar.MINUTE), 
       c.getActualMinimum(Calendar.SECOND) 
      ); 

     c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND)); 
     Date start = c.getTime(); 

     /** 
     * Get latest possible date 
     */ 
     c.set(
       c.getActualMaximum(Calendar.YEAR), 
       c.getActualMaximum(Calendar.MONTH), 
       c.getActualMaximum(Calendar.DAY_OF_MONTH), 
       c.getActualMaximum(Calendar.HOUR), 
       c.getActualMaximum(Calendar.MINUTE), 
       c.getActualMaximum(Calendar.SECOND) 
      ); 

     c.set(Calendar.MILLISECOND, c.getActualMaximum(Calendar.MILLISECOND)); 
     Date end = c.getTime(); 

     DateRange range = new DateRange(); 
     range.Start = start; 
     range.End = end; 

     return range; 
    } 
+0

Phương pháp của bạn trở lại là gì? –

Trả lời

4

Tại sao làm cho cuộc sống quá phức tạp? Nếu bạn không có ngày bắt đầu, đừng truy vấn ngày bắt đầu. Nếu bạn không có ngày kết thúc, đừng truy vấn ngày kết thúc. Và nếu bạn không có, không truy vấn cho ngày cả.

+0

Haha yeah, đó là những gì tôi đã làm. Đây là một trường hợp đặc biệt và vì mọi trường hợp khác đều có một số khởi đầu/kết thúc, tôi chỉ sử dụng một phương pháp. Kết thúc bằng văn bản một phương pháp để bao gồm trường hợp này và đã viết một truy vấn mà không kiểm tra ngày. Điều đó nói rằng, nó lỗi tôi không biết và tôi thực sự muốn biết tại sao điều này không làm việc. –

0

Mã đó hoạt động với tôi, có thể bạn không mong đợi các giá trị trả về?

bắt đầu: Sat 01 tháng 1 00:00:00 PST 1 End: Wed 17 tháng 4 21:34:08 PST 292.269.054

(Sẽ dễ dàng hơn để giúp đỡ nếu bạn đã bao gồm stack trace)

17

tại sao không sử dụng

ngày
  1. mới (Long.MIN_VALUE) (trong nĂM 292.269.055 BC)
  2. new Date (Long.MAX_VALUE) (trong nĂM 292.278.994 AD)?

Kể từ froginvasion thách thức câu trả lời, tôi nghĩ rằng tôi muốn kiểm tra

long day=1000*60*60*24; 
    System.out.println(new Date(Long.MAX_VALUE-day)); 
    System.out.println(new Date(Long.MAX_VALUE)); 
    System.out.println(new Date(0)); 
    System.out.println(new Date(-day)); 
    System.out.println(new Date(Long.MIN_VALUE)); 
    System.out.println(new Date(Long.MIN_VALUE+day)); 

tăng gấp đôi đã cho tôi

Sat Aug 16 07:12:55 GMT 292278994 
Sun Aug 17 07:12:55 GMT 292278994 
Thu Jan 01 00:00:00 GMT 1970 
Wed Dec 31 00:00:00 GMT 1969 
Sun Dec 02 16:47:04 GMT 292269055 
Mon Dec 03 16:47:04 GMT 292269055 

Tôi nghĩ rằng đó là đúng. Tôi cho rằng AD/BC đang bị đàn áp. Đề xuất sử dụng Ngày mới (0) là mức tối thiểu rõ ràng là sai vì Ngày (-day) mới rõ ràng là nhỏ hơn.

+0

Giải pháp đơn giản và thanh lịch! – nobre

+0

Đồng ý !, rất tốt để sử dụng các giá trị tĩnh cho việc này! +1 – will824

+1

'ngày mới (Long.MIN_VALUE)' không hoạt động, hãy thử nghiệm.Nó không thực sự làm điều gì đó bạn mong đợi. Nếu bạn muốn sử dụng điều này, hãy sử dụng 'new Date (0)' vào ngày 1 tháng 1 năm 1970. – froginvasion

0

Tôi nghi ngờ có thể bị tràn bằng cách đặt năm và sau đó đặt giá trị tối đa cho tất cả các trường khác một cách riêng biệt. Điều đó sẽ làm cho thời gian kết thúc của bạn ở đâu đó xung quanh thời gian bắt đầu của bạn và khiến tất cả hồ sơ bị từ chối. Bạn có thể thử chỉ in ra thời gian lịch để xem điều gì đang xảy ra.

Như seanizer chỉ ra, bạn đang thực sự làm cho điều này phức tạp hơn nó phải là - cách chính xác để đối phó với điều này là để lại mệnh đề ngày hoàn toàn trong truy vấn. Đôi khi điều đó có thể khó bởi vì câu lệnh sql không được tạo động. Nhưng lưu ý rằng ngay cả khi bạn không thể sửa đổi sql tại thời gian chạy, điều kiện (trong Oracle)

start_date >= nvl(?, start_date) 

sẽ luôn luôn được thỏa mãn nếu giá trị cung cấp là null và start_date là dân cư.

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