MySQL是一種流行的關系型數據庫管理系統,它的日期類型默認只精確到月份。在MySQL中,日期類型有三種:DATE、DATETIME和TIMESTAMP。其中,DATE只包含日期部分,不包含時間部分;DATETIME包括日期和時間部分,精確到秒;TIMESTAMP也包括日期和時間部分,精確到秒,但只能存儲從1970年1月1日到2038年1月19日之間的時間。
CREATE TABLE test( id INT, date DATE ); INSERT INTO test VALUES (1, '2022-01-01'), (2, '2022-01-02'); SELECT * FROM test WHERE date = '2022-01';
在上面的例子中,我們創建了一個包含id和date字段的test表。日期格式為'YYYY-MM-DD',我們將2022年1月1日和2022年1月2日作為數據插入了表中。最后一行代碼中我們使用了一個WHERE子句過濾了date字段的值,但是WHERE子句中我們只指定了日期的月份和年份,沒有指定日期,此時MySQL會將條件轉化為'2022-01-01 00:00:00'<= date< '2022-02-01 00:00:00',因此我們得到了包含2022年1月份數據的結果。
需要注意的是,使用WHERE子句過濾日期時,由于日期只精確到月份,因此可能會出現我們不希望看到的情況。比如,假設我們希望篩選出2022年1月1日到2022年1月31日之間的數據,但如果我們使用以下代碼,將無法得到正確的結果:
SELECT * FROM test WHERE date >= '2022-01-01' AND date<= '2022-01-31';
因為MySQL中的日期只精確到月份,假設表中還有2022年1月份以外的數據,我們會得到包含這些數據的結果。正確的做法是使用MONTH()和YEAR()函數提取日期中的月份和年份進行篩選:
SELECT * FROM test WHERE YEAR(date) = 2022 AND MONTH(date) = 1;
這樣就可以得到我們期望的結果了。