2014-12-31 23 views
6

PostgreSQL cung cấp kiểu dữ liệu định dạng date để lưu ngày tháng. Tuy nhiên, vấn đề với những ngày này là không thể - theo như tôi biết - lý do về sự không chắc chắn.Cách trình bày ngày tháng không chắc chắn trong PostgreSQL

Đôi khi người ta không biết ngày đầy đủ của một điều gì đó, nhưng biết điều đó xảy ra vào tháng 1 năm 1995 hoặc trong "1999 hoặc 2000" (date2). Có thể có một vài lý do cho điều đó:

  • Mọi người không nhớ ngày chính xác;
  • Ngày chính xác về cơ bản không xác định: ví dụ: một người được nhìn thấy lần cuối vào một ngày nào đó và đã tìm thấy cái chết vài ngày sau đó; hoặc
  • Chúng tôi xử lý các sự kiện trong tương lai để vẫn có một số cơ hội xảy ra sự cố.

Tôi đã tự hỏi nếu có một kiểu dữ liệu để lưu trữ "ngày" như vậy và cách chúng được giao. Nó sẽ dẫn đến logic có giá trị đối với một số hoạt động như ví dụ date2 < 20001/01/01 phải là true, date2 < 2000/01/01possibledate2 < 1998/01/01 phải là false.

Nếu không có kiểu dữ liệu như vậy, thực tiễn tốt để xây dựng "bảng" đó là gì?

+4

Bạn có thể lưu trữ các ngày như cặp, ngày đầu tiên và ngày cuối cùng, sau đó sử dụng chức năng Postgres như 'chồng chéo' trong khoảng thời gian. –

Trả lời

5

Có một số cách khác nhau để tiếp cận ngày mờ. Trong PostgreSQL, bạn có thể sử dụng

  • một cặp cột ngày (earliest_possible_date, latest_possible_date),
  • một cột ngày và một cột chính xác ('2012/01/01', 'năm'), hoặc
  • một range data type (datarange), hoặc
  • một varchar ('2013/01/02?', '2013 - ?? - 05'), hoặc
  • một bảng hoặc bảng với bất kỳ của những kiểu dữ liệu.

Loại dữ liệu phạm vi là khác biệt với các phiên bản gần đây của PostgreSQL. Bạn có thể sử dụng những người khác trong bất kỳ dbms SQL nào.

Loại mờ mà bạn cần là phụ thuộc vào ứng dụng. Cách bạn truy vấn ngày mờ phụ thuộc vào loại dữ liệu hoặc cấu trúc bạn chọn. Bạn cần nắm vững về những loại mờ mà bạn cần lưu trữ và về loại câu hỏi mà người dùng của bạn cần được trả lời. Và bạn cần phải kiểm tra để đảm bảo cơ sở dữ liệu của bạn có thể trả lời câu hỏi của họ.

Ví dụ: trong các ngày hệ thống pháp lý có thể được ghi nhớ kém hoặc bị xóa. Ai đó có thể nói "Đó là một số thứ năm trong tháng 1 năm 2014. Tôi biết đó là thứ Năm, vì đó là ngày nhặt rác" hoặc "Đó là tuần đầu tiên vào tháng 6 hoặc tháng 7 năm ngoái". Để ghi lại loại mờ đó, bạn cần một bảng khác.

Hoặc dấu bưu điện có thể bị xóa để bạn chỉ có thể đọc "14, 2014". Bạn biết nó đã được đóng dấu bưu điện vào ngày 14, nhưng bạn không biết tháng nào. Một lần nữa, bạn cần một bảng khác.

Một số (tất cả?) Trong số này sẽ không cung cấp cho bạn logic có giá trị ba trừ khi bạn nhảy qua một số vòng lặp. ("Có thể" không phải là giá trị Boolean hợp lệ.)

+0

Tôi cũng có thể tạo hình ảnh bằng cột 'hstore' nơi bạn sử dụng" độ chính xác "làm khóa:' date_col -> 'year'' hoặc 'date_col ->' quarter''. Có thể linh hoạt hơn một varchar với trình giữ chỗ. –

+0

@a_horse_with_no_name: Tốt. JSON và các loại mảng cũng là các khả năng. Ngay cả XML cũng có thể hoạt động. Tất cả những yêu cầu này đòi hỏi nhiều mã thủ tục hơn để loại bỏ dữ liệu xấu. (Tôi rất vui vì tôi không phải đối phó với những ngày mờ ảo như trước đây.) –

2

Để thêm vào những gì Mike posted Tôi sẽ sử dụng ngày comment như:

date   Comment 
------------------------------------------------------------------- 
1/1/2010  Sometime in 2010 
7/8/2014  Customer says they will pay the second week in July 
1/1/2015  Package will arrive sometime next year in January 

Ngoài ra, bạn có thể sử dụng phần ngày. Tạo một cột riêng cho Năm, Tháng và Ngày. Những gì chưa bao giờ được biết để trống nó.

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