mysql可以比較時間嗎

mysql中可以實現比較時間,其語句如【 select testdate FROM t1 WHERE testdate >= ‘2018-09-12’;SELECT testdate FROM t1 WHERE testdate >= 20180912;】。

mysql可以比較時間嗎

最近發現自己一直以來經常用一種錯誤的方法在比較日期,例如一下語句,a字段是一個DATETIME類型的列:

select?a?from?t1?where?DATEDIFF(a,?'2018-09-11')?<p>該語句是為了查出2018-09-11 日期之前的所有記錄,但這個語句有個問題,如果a字段加了索引,用這種類型進行日期對比,會導致查詢不走索引,從而使查詢性能下降。</p><p>推薦課程:<a href="http://www.php.cn/course/list/51.html" target="_self">MySQL教程</a>。</p><p><img  src="https://img.php.cn/upload/article/000/000/029/5cd4f0b27dbd5666.jpg" alt="mysql可以比較時間嗎" ></p><p>看了Mysql關于日期字段對比的文檔。在進行日期比較的時候,<a   style="max-width:90%" title="mysql" href="https://www.php.cn/zt/15713.html" target="_blank">mysql</a>會自動將日期轉換成數字進行比較。where條件后,使用字符串格式日期與DATE,DATETIME,timestamp,TIME類型字段進行比較的時候,對字符串格式要求不嚴格,你可以使用任意格式的分隔符來表示日期,例如"2018-09-11","2018#09#11","2018&amp;09&amp;11"對于mysql來說,都是相同的日期。如果沒有分隔符,例如"20180911",與"2018-09-11"或其他有分隔符的日期,也是相同的。例如下圖</p><pre class="brush:php;toolbar:false">select a from t1 where a < '2018#09#11'; 與 select a from t1 where a < '2018-09-11'; 與 select a from t1 where a < '20180911'; 所代表的意義是相同的,都是查詢日期小于2018年9月11日的數據 也就是說上圖的查詢語句,完全可以重寫為,這么做的好處?就是會使用索引,是查詢更快 select a from t1 where a < '2018-09-11';

當將日期類型字段與字符串型日期進行,>=,

下面三種情況除外:

1,兩個表格字段的對比;

2,日期類型字段與表達式對比;

3,使用表達式對日期類型字段進行對比;

原因:對于以上三種情況,mysql會將日期轉換為字符串進行比較。

下面的例子,都是可以正常運行的:

INSERT INTO t1 (testdate) VALUES (20180912); INSERT INTO t1 (testdate) VALUES ('20180912'); INSERT INTO t1 (testdate) VALUES ('18-09-12'); INSERT INTO t1 (testdate) VALUES ('2018.09.12'); INSERT INTO t1 (testdate) VALUES ('2018 09 12'); INSERT INTO t1 (testdate) VALUES ('0000-00-00');  SELECT testdate FROM t1 WHERE testdate >= '2018-09-12'; SELECT testdate FROM t1 WHERE testdate >= 20180912; SELECT MOD(testdate,100) FROM t1 WHERE testdate >= 20180912; SELECT testdate FROM t1 WHERE testdate >= '20180912';

Mysql允許存儲”0000-00-00″作為DATE類型的“0”值,也稱之為虛擬日期。在某些場景下比儲存NULL值更便捷。如果將一個不合法的日期值保存到DATE類型字段中,mysql默認存儲為”0000-00-00″。?如果不允許存儲”0″值,請啟用NO_ZERO_DATE參數。

也可使用unix_timestamp函數,將字符型的時間,轉成unix時間戳。

select meeting_id,meeting_name,start_time,end_time from meeting_data  	where meeting_id REGEXP '[0-9]{4}0001'  		and unix_timestamp(start_time) < unix_timestamp(NOW())  		and unix_timestamp(end_time) > unix_timestamp(NOW());

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享