今天遇到一個需要以時間差為條件的查詢場景,需要查詢出用戶在某天通話時間大於15秒的記錄,由於對sql了解的並不多,一開始嘗試直接用時間計算,發現果然行不通,然后Google了一些資料,發現各個數據庫都有針對時間計算的函數,在這里總結一下MySQL的,其他數據庫的有輕微的差異,不過也都是大同小異,也可以借鑒
TIMESTAMPDIFF(時間單位,參數1,參數2)
可以設置參數,可以精確到天(DAY),小時(HOUR),分鍾(MINUTE),秒(SECOND),毫秒(FRAC_SECOND(低版本不支持,可以用秒,再乘1000)),計算機制為參數2-參數1,最后結果為數字,單位為第一個參數設置的值
(week 周,month 月,quarter 季度,year 年 )這幾個單位沒有經過測試,但是應該也是支持的
--相差1天
select TIMESTAMPDIFF(DAY, '2018-03-20 23:59:00', '2015-03-22 00:00:00');
--相差49小時
select TIMESTAMPDIFF(HOUR, '2018-03-20 09:00:00', '2018-03-22 10:00:00');
--相差2940分鍾
select TIMESTAMPDIFF(MINUTE, '2018-03-20 09:00:00', '2018-03-22 10:00:00');
--相差176400秒
select TIMESTAMPDIFF(SECOND, '2018-03-20 09:00:00', '2018-03-22 10:00:00');
--相差大於等於15秒
SELECT * FROM 表名 WHERE TIMESTAMPDIFF(SECOND,start_time(較小的時間),stop_time(較大的時間)) >= 15
DATEDIFF(參數1,參數2)
返回值為相差的天數,int類型,不能定位到時分秒,因為固定天數為單位,所以比上面的少一個可設置的參數,且計算機制為參數1-參數2,與上面的計算機制相反,如果搞錯了會計算出負數,mysql也算是給埋了個坑
-- 相差2天
select datediff('2018-03-22 09:00:00', '2018-03-20 07:00:00');
TIMDIFF(參數1,參數2)
返回值為兩個之間相差的差值,類型與參數1和參數2的類型相同,不適宜用於計算,可用來當做結果,計算機制為參數1-參數2
SELECT TIMEDIFF('2018-05-21 14:51:43','2018-05-19 12:54:43');
結果為:49:57:00
其他日期函數
- now()函數返回的是當前時間的年月日時分秒
- curdate()函數返回的是年月日信息
- curtime()函數返回的是當前時間的時分秒信息
- 對一個包含年月日時分秒日期格式化成年月日日期,可以使用DATE(time)函數
- 注:now()與sysdate()類似,只不過now()在執行開始時就獲取,而sysdate()可以在函數執行時動態獲取。
本文參考博客
https://www.cnblogs.com/hider/p/9067010.html