Đầu tiên, cảm ơn cho tất cả các câu trả lời của bạn. Không ai trong số họ, như là, là một giải pháp tốt cho vấn đề của tôi, nhưng, để bảo vệ bạn, tôi nên nói thêm rằng tôi đã không đưa ra tất cả các yêu cầu. Nhưng mỗi người giúp tôi suy nghĩ về vấn đề của mình và một số ý tưởng của bạn là một phần của giải pháp cuối cùng của tôi.
Vì vậy, giải pháp cuối cùng của tôi, về phía DB, là sử dụng varchar (giới hạn ở 10 ký tự) và lưu trữ ngày trong đó, dưới dạng chuỗi, ở định dạng ISO (YYYY-MM-DD) với 00 trong tháng và ngày khi không có tháng và / hoặc ngày (như ngày trong MySQL). Bằng cách này, trường này có thể hoạt động với bất kỳ cơ sở dữ liệu nào, dữ liệu có thể được con người đọc, hiểu và chỉnh sửa trực tiếp và dễ dàng bằng một ứng dụng khách đơn giản (như ứng dụng khách mysql, phpmyadmin, v.v.). Đó là một yêu cầu. Nó cũng có thể được xuất sang Excel / CSV mà không cần bất kỳ chuyển đổi nào, v.v. Điểm bất lợi là định dạng không được thực thi (ngoại trừ trong Django). Ai đó có thể viết 'not a date' hoặc làm sai định dạng và DB sẽ chấp nhận nó (nếu bạn có ý tưởng về vấn đề này ...).
Bằng cách này, bạn cũng có thể thực hiện tất cả các điều đặc biệt truy vấn của một ngày lĩnh vực tương đối dễ dàng. Đối với các truy vấn với WHERE:<,>, <=,> =và =hoạt động trực tiếp. Truy vấn IN và BETWEEN cũng hoạt động trực tiếp. Để truy vấn theo ngày hoặc tháng, bạn chỉ cần thực hiện với EXTRACT (NGÀY | THÁNG ...). Công việc đặt hàng cũng trực tiếp. Vì vậy, tôi nghĩ rằng nó bao gồm tất cả các nhu cầu truy vấn và hầu như không có gì phức tạp.
Về phía Django, tôi đã làm được 2 điều. Đầu tiên, tôi đã tạo một PartialDate
đối tượng gần giống như datetime.date
nhưng hỗ trợ ngày mà không có tháng và / hoặc ngày. Bên trong đối tượng này, tôi sử dụng một đối tượng datetime.datetime để giữ ngày. Tôi đang sử dụng giờ và phút làm cờ cho biết tháng và ngày có hợp lệ không khi chúng được đặt thành 1. Có cùng ý tưởng rằng steveha đề xuất nhưng với một cách triển khai khác (và chỉ ở phía khách hàng). Sử dụng datetime.datetime
đối tượng cung cấp cho tôi rất nhiều tính năng hay để làm việc với ngày tháng (xác thực, so sánh, v.v.).
Thứ hai, tôi đã tạo một PartialDateField
điều đó chủ yếu giải quyết việc chuyển đổi giữa PartialDate
đối tượng và cơ sở dữ liệu.
Cho đến nay, nó hoạt động khá tốt (tôi hầu như đã hoàn thành các bài kiểm tra đơn vị mở rộng của mình).