簡體   English   中英

將整數轉換為datetime(dd:hh:mm:ss)

[英]Convert integer into datetime (dd:hh:mm:ss)

SELECT AVG (closeTime - createTime)
FROM Deals
WHERE dealid = 123

'closeTime'和'addTime'具有DATETIME(YYYY-MM-DD HH:MI:SS)格式。 結果是:

105030215.0000

我應該使用哪個函數將此值轉換為DATETIME?

addTime: 12/04/2016 13:06
closeTime:  12/05/2017 16:08

我正在尋找的結果(我在Excel中計算):

29:03:02:15 (DD:HH:MM:SS)

在MySQL中減去DATETIME似乎沒有在幾秒鍾內給出它們之間的差異。 有了你的兩個例子日期,2016-04-12 13:06和2016-05-12 16:08(假設2017年你的問題是一個錯字),減去它們會返回100030200,而正確答案是2602920.這是由因數為38.4而且有點。

用於以秒為單位返回差異的MySQL函數是TIMESTAMPDIFF ,實際上, SELECT TIMESTAMPDIFF(SECOND, '2016-04-12 13:06', '2016-05-12 16:08')返回正確的秒數。

現在我們需要做的就是將其轉換為您的格式。 MySQL有一個內置函數SEC_TO_TIME ,它可以做到這一點,但不幸的是,它不適用於超過839小時的時間段,並且它沒有單獨列出日期。 我們可以通過計算與其余計算分開的天數並在從差異中減去天數后在剩余時間使用SEC_TO_TIME來解決這個問題。

SELECT CONCAT(
    TIMESTAMPDIFF(DAY, '2016-04-12 13:06', '2016-05-12 16:08'), ':',
    SEC_TO_TIME(TIMESTAMPDIFF(SECOND, '2016-04-12 13:06', '2016-05-12 16:08') % 86400));
-- 30:03:02:00 (DD:HH:MM:SS)

這似乎是正確的答案。 雖然你想要的輸出是29:03:02:15 ,但是4月有30天,輸入中沒有秒。

當您使用聚合函數來確定秒數時,我們將無法以秒為單位選擇與值分開的值(否則我們將得到平均值的一部分后面的平均天數)秒數),所以你必須重寫它

SELECT CONCAT(
    FLOOR(AVG(TIMESTAMPDIFF(SECOND, createTime, closeTime)) / 86400), ':',
    SEC_TO_TIME(AVG(TIMESTAMPDIFF(SECOND, createTime, closeTime)) % 86400))
FROM deals WHERE dealid = 123;
-- 30:03:02:00.0000

現在這包括幾分之一秒,因為平均差異可能不是一個圓秒數。 要排除它們,請使用FLOORROUND

SELECT CONCAT(
    FLOOR(AVG(TIMESTAMPDIFF(SECOND, createTime, closeTime)) / 86400), ':',
    SEC_TO_TIME(ROUND(AVG(TIMESTAMPDIFF(SECOND, createTime, closeTime))) % 86400))
FROM deals WHERE dealid = 123;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM