MySQL加減間隔時(shí)間函數(shù)DATE_ADD和DATE_SUB的實(shí)現(xiàn)
前言
mysql中內(nèi)置函數(shù)date_add 和 date_sub能對(duì)指定的時(shí)間進(jìn)行增加或減少一個(gè)指定的時(shí)間間隔,返回的是一個(gè)日期。
語法
添加時(shí)間間隔
DATE_ADD(date,INTERVAL expr type) SELECT DATE_add(NOW(),INTERVAL -7 DAY);//獲取7天前的日期 SELECT DATE_add(NOW(),INTERVAL 7 DAY);//獲取7天后的日期
減少時(shí)間間隔
DATE_SUB(date, INTERVAL expr type) SELECT DATE_SUB(NOW(),INTERVAL -7 DAY);//獲取7天后的日期 SELECT DATE_SUB(NOW(),INTERVAL 7 DAY);//獲取7天前的日期
參數(shù)說明
date 操作的時(shí)間
INTERVAL為關(guān)鍵詞
expr 具體數(shù)值
type 時(shí)間間隔單位
可用的type參數(shù)值如下:
注意:type可以復(fù)合型的,比如 YEAR_MONTH。如果type不是復(fù)合型的,DATE_ADD和DATE_SUB其實(shí)可以通用,因?yàn)閑xpr可以為一個(gè)負(fù)數(shù)。對(duì)應(yīng)復(fù)合型的type,需要使用引號(hào)對(duì)兩個(gè)參數(shù)進(jìn)行引用起來,中間用任何非數(shù)字字符作為間隔即可,并且不能使用負(fù)數(shù)。但是時(shí)間間隔只指定了一個(gè)值, 那么也能正常工作,但是對(duì)應(yīng)XXX_YYY使用的是下劃線后YYY的單位,也就相當(dāng)于 一單位的type,這時(shí)也就可以使用負(fù)數(shù)。
示例代碼
復(fù)合型
select date_add('2024-04-29', interval '1 2' YEAR_MONTH); #結(jié)果:2025-06-29 select date_add('2024-04-29', interval '1-2' YEAR_MONTH); #結(jié)果:2025-06-29 select date_add('2024-04-29', interval '1,2' YEAR_MONTH); #結(jié)果:2025-06-29 select date_add('2024-04-29', interval 1 YEAR_MONTH); #結(jié)果:2024-05-29 select date_add('2024-04-29', interval -1 YEAR_MONTH); #結(jié)果:2024-03-29 # 這里先減1年,再減2月,最后減1天,有點(diǎn)意思 select date_sub('2024-04-29', interval '1 2' YEAR_MONTH); #結(jié)果:2023-02-28 select date_sub('2024-04-29', interval '1-2' YEAR_MONTH); #結(jié)果:2023-02-28 select date_sub('2024-04-29', interval '1,2' YEAR_MONTH); #結(jié)果:2023-02-28 select date_sub('2024-04-29', interval 1 YEAR_MONTH); #結(jié)果:2024-03-29 select date_sub('2024-04-29', interval -1 YEAR_MONTH); #結(jié)果:2024-05-29
非復(fù)合型
select date_add(now(), interval 1 day); # 加1天 2024-04-30 16:25:49 select date_add(now(),INTERVAL -1 DAY); # 當(dāng)前日期向前推1天 2024-04-28 16:25:49 select date_add(now(), interval 1 hour);# 加1小時(shí) 2024-04-29 17:25:49 select date_add(now(), interval 1 minute); # 加1分鐘 2024-04-29 16:26:49 select date_add(now(), interval 1 second); # 加1秒 2024-04-29 16:25:50 select date_add(now(), interval 1 microsecond); # 加1毫秒 2024-04-29 16:25:49.000001 select date_add(now(), interval 1 week); # 加1周 2024-05-06 16:25:49 select date_add(now(), interval 1 month);# 加1月 2024-05-29 16:25:49 select date_add(now(), interval 1 quarter); # 加1季 2024-07-29 16:25:49 select date_add(now(), interval 1 year);# 加1年 2025-04-29 16:25:49 select date_sub(now(), interval 1 day); # 減1天 2024-04-28 16:31:34 select date_sub(now(),INTERVAL -1 DAY); # 當(dāng)前日期向后推1天 2024-04-30 16:31:34 select date_sub(now(), interval 1 hour);# 減1小時(shí) 2024-04-29 15:31:34 select date_sub(now(), interval 1 minute); # 減1分鐘 2024-04-29 16:30:34 select date_sub(now(), interval 1 second); # 減1秒 2024-04-29 16:31:33 select date_sub(now(), interval 1 microsecond); # 減1毫秒 2024-04-29 16:31:33.999999 select date_sub(now(), interval 1 week); # 減1周 2024-04-22 16:31:34 select date_sub(now(), interval 1 month);# 減1月 2024-03-29 16:31:34 select date_sub(now(), interval 1 quarter); # 加1季 2024-01-29 16:31:34 select date_sub(now(), interval 1 year);# 減1年 2023-04-29 16:31:34
運(yùn)用
電商系統(tǒng)往往會(huì)有這樣一個(gè)功能,客戶收到貨后如果七天不點(diǎn)擊收貨按鈕話,系統(tǒng)會(huì)自動(dòng)將訂單設(shè)置為完成。這個(gè)功能就要求查詢妥投七天后沒有點(diǎn)擊收貨按鈕的訂單,將它們?cè)O(shè)置為完成。
相關(guān)SQL:
SELECT o.order_id, o.third_order_id FROM cere_shop_order o WHERE o.state < 4 AND o.interface_call_time <= DATE_SUB(NOW(), INTERVAL 7 DAY)
state 訂單狀態(tài),小于4查詢未完成的訂單,interface_call_time為妥投時(shí)間,o.interface_call_time <= DATE_SUB(NOW(), INTERVAL 7 DAY) 這里將當(dāng)前時(shí)間減去7天后,再去和妥投時(shí)間進(jìn)行比較,小于或等于這個(gè)結(jié)果的都是妥投超過了7天的訂單。
這是比較推薦的寫法,但還可以寫成
SELECT o.order_id, o.third_order_id FROM cere_shop_order o WHERE o.state < 4 AND DATE_ADD(o.interface_call_time,INTERVAL 7 DAY) < NOW();
這種寫法將要查詢的字段參與了函數(shù)計(jì)算,索引會(huì)失效,將會(huì)值全表掃描,性能很差,不推薦送使用。
到此這篇關(guān)于MySQL加減間隔時(shí)間函數(shù)DATE_ADD和DATE_SUB的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL DATE_ADD和DATE_SUB內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL計(jì)劃任務(wù)(事件調(diào)度器) Event Scheduler介紹
MySQL5.1.x版本中引入了一項(xiàng)新特性EVENT,顧名思義就是事件、定時(shí)任務(wù)機(jī)制,在指定的時(shí)間單元內(nèi)執(zhí)行特定的任務(wù),因此今后一些對(duì)數(shù)據(jù)定時(shí)性操作不再依賴外部程序,而直接使用數(shù)據(jù)庫本身提供的功能2013-10-10通過DML更新MySQL數(shù)據(jù)庫數(shù)據(jù)的示例代碼
這篇文章主要給大家介紹了如何通過DML更新MySQL數(shù)據(jù)庫的數(shù)據(jù),通過DML來對(duì)數(shù)據(jù)庫種地表的數(shù)據(jù)記錄進(jìn)行增刪改查操作,文中給大家了詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2024-01-01mysql數(shù)據(jù)庫常見的優(yōu)化操作總結(jié)(經(jīng)驗(yàn)分享)
這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)庫常見的優(yōu)化操作,文章總結(jié)的都是個(gè)人日常開發(fā)使用mysql數(shù)據(jù)庫的經(jīng)驗(yàn)所得,其中包括Index索引、少用SELECT*、EXPLAIN SELECT以及開啟查詢緩存等相關(guān)資料,相信會(huì)對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-04-04MySQL?INSERT語句實(shí)現(xiàn)當(dāng)記錄不存在時(shí)插入的幾種方法
MySQL的INSERT語句是用于向數(shù)據(jù)庫表中插入新記錄的關(guān)鍵命令,下面這篇文章主要介紹了MySQL?INSERT語句實(shí)現(xiàn)當(dāng)記錄不存在時(shí)插入的幾種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03MySQL 使用 Performance Schema 定位和解決慢
本文介紹了如何使用MySQL的PerformanceSchema來定位和解決慢SQL查詢問題,通過啟用PerformanceSchema并分析相關(guān)的系統(tǒng)表,可以收集到詳細(xì)的性能數(shù)據(jù),從而識(shí)別出影響性能的SQL語句,優(yōu)化策略包括優(yōu)化查詢語句、調(diào)整數(shù)據(jù)庫配置等2025-02-02