Có một lưu ý nhỏ trong documentation for the DATE_FORMAT() về MySQL cho phép ngày không đầy đủ:
Ranges cho tháng và ngày specifiers bắt đầu với zero do thực tế rằng MySQL cho phép lưu trữ các số ngày không đầy đủ như ' 2014-00-00 '.
Như đã chỉ ra bởi @wonk0, MySQL sẽ tập hợp số ngày không hợp lệ để 0000-00-00 00:00:00
khi ALLOW_INVALID_DATES
không được thiết lập. Tuy nhiên, ngay cả khi ALLOW_INVALID_DATES
không được đặt, việc chèn một năm hợp lệ với tháng và ngày được đặt bằng 0 không xuất hiện để kích hoạt hành vi này - ít nhất là không có trong thử nghiệm của tôi (MySQL 5.1.54-1ubuntu4). Tôi đã sử dụng tính năng này trước đây mà không có bất kỳ vấn đề nào, nhưng tôi đã không thể tìm thấy bất kỳ tài liệu chi tiết nào khác mô tả hành vi này đầy đủ.
So sánh ngày/giờ cũng có vẻ hoạt động như mong đợi: ví dụ: 2011-01-00 > 2011-00-00
và 2011-00-01 > 2011-00-00
làm như bạn mong đợi.
CẬP NHẬT
Xem this answer (bằng cách khác Mike) cho một câu hỏi tương tự. Nó trỏ đến một chiết xuất từ The Definitive Guide để MySQL 5:
Trong các phiên bản cũ của MySQL, DATE và các kiểu dữ liệu DATETIME đã chỉ một số lượng hạn chế của loại hình kiểm tra. Giá trị từ 0 đến 12 cho tháng và 0 và 31 cho các ngày thường được cho phép. Tuy nhiên, nó là trách nhiệm của chương trình khách hàng để cung cấp dữ liệu chính xác. (Ví dụ: , 0 là giá trị được phép cho một tháng hoặc ngày, để cung cấp khả năng lưu trữ dữ liệu không đầy đủ hoặc không xác định.)
Bắt đầu với MySQL 5.0.2, có xác thực kỹ lưỡng hơn, vì vậy chỉ có thể lưu trữ dữ liệu hợp lệ. Vẫn được phép là tháng và giá trị ngày 0, cũng như ngày 0000-00-00.
Bạn nhận được gì khi bạn truy vấn 'SELECT mydate FROM tableA'? – phlogratos
Giá trị chính xác, tức là 2001-00-00. Nỗi lo của tôi chỉ là tôi đang khai thác một số hành vi tiêu chuẩn không phụ thuộc vào một số thủ thuật có thể nghỉ một ngày hoặc không hoạt động trong một số trường hợp nhất định. –