2012-12-05 27 views
3

標題可能有點混亂,以便讓我解釋一下。我正在使用表格來記錄我的工作日誌。我每天都會創建一個條目,說明我什麼時候工作,什麼時候工作,我會添加一條評論來描述我所做的事情。超越838 MySQL的TIME值上限:59:59

我然後使用查詢來比較時間戳來弄清楚我究竟有多少個小時和分鐘的那一天的工作。此外,我使用一個查詢來計算我整年工作的小時數和分鐘數。這就是我遇到問題的地方。我的查詢如下。

SELECT TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(entry_end_time, entry_start_time)))), '%H:%i') 
AS total FROM entry 
WHERE entry_date BETWEEN '2012-01-01' AND '2012-12-31' AND user_id = 3 

默認情況下,MySQL的時間字段允許的時間範圍 '-838:59:59' 到 '838:59:59'。儘管我目前已經記錄了900多個小時的工作,但我希望我的查詢結果能夠反映出這一點。相反,結果是838:59:59,這是有道理的,因爲這是極限。

有沒有解決這個任何方式使查詢的結果可以超越839小時,否則我將不得不使用像PHP去了整個表,並添加了這一切?如果可能,我有點想避免。

回答

6

我只是檢索的總秒數工作,並轉換爲小時/分鐘在我的應用程序的表示層所需(它畢竟是由60師的一個簡單的例子):

<? 
    $dbh = new PDO("mysql:dbname=$dbname", $username, $password); 
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); 

    $qry = $dbh->prepare(' 
    SELECT SUM(TIME_TO_SEC(entry_end_time)-TIME_TO_SEC(entry_start_time)) 
    FROM entry 
    WHERE entry_date BETWEEN :start_date AND :end_date 
     AND user_id = :user_id 
    '); 

    $qry->execute([ 
    ':start_date' => '2012-01-01', 
    ':end_date' => '2012-12-31', 
    ':user_id' => 3 
    ]); 

    list ($totalMins, $remngSecs) = gmp_div_qr($qry->fetchColumn(), 60); 
    list ($totalHour, $remngMins) = gmp_div_qr($totalMins, 60); 

    echo "Worked a total of $totalHour:$remngMins:$remngSecs."; 
?> 
+0

當我發現您的更新時,我已經在處理代碼。謝謝,我會去解決這個問題! – Wesley

1

看一看timestampdiff不有時間限制。 也就是說像(未經測試):

SELECT CONCAT(
     TIMESTAMPDIFF(HOURS, entry_end_time, entry_start_time), 
     ":", 
     MOD(TIMESTAMPDIFF(MINUTES, entry_end_time, entry_start_time),60) 
    ) 
AS total FROM entry 
WHERE entry_date BETWEEN '2012-01-01' AND '2012-12-31' AND user_id = 3 

concats不理想,我敢肯定會有更優雅的解決方案。

+1

從MySQL文檔:'通過TIMEDIFF()返回的結果限制爲()UNIX_TIMESTAMP()允許的時間values' –

+1

@JohnBlythe緊接着,它說,'或者,您可以使用該功能TIMESTAMPDIFF的範圍,兩者都返回整數。「請注意,我的答案使用'TIMESTAMPDIFF()'而不是'TIMEDIFF()'。 – Jim

+0

oi!我一定會在閱讀中轉向。謝謝澄清 –

-1
select concat(truncate(sum(time_to_sec(TIMEDIFF(hora_fim, hora_ini)))/3600,0), ':', 
TIME_FORMAT(sec_to_time(sum(time_to_sec(TIMEDIFF(hora_fim, hora_ini))) - truncate(sum(time_to_sec(TIMEDIFF(hora_fim, hora_ini)))/3600,0)*3600), '%i:%s')) 
as hms from tb_XXXXXX 
0

分別計數的天就夠了。
下面是我使用的連接。

我完全複製/ pastable例子說明,以緩解我們打了極限的理解(TIME format的最大值)
免費麒麟捆綁簡化逗號管理

SELECT 'pq7~' AS unicorn 
####################### 
## Expected result ## 
####################### 
## Total, formatted as days:hh:mm:ss ## 
    ,CONCAT(
    FLOOR(TIMESTAMPDIFF(SECOND, '2017-01-01 09:17:45', '2017-03-07 17:06:24')/86400) 
    , ':' 
    , SEC_TO_TIME(TIMESTAMPDIFF(SECOND, '2017-01-01 09:17:45', '2017-03-07 17:06:24') % 86400) 
) AS Real_expected_result 

######################### 
## Calculation details ## 
######################### 
## Extracted days from diff ## 
    ,FLOOR(TIMESTAMPDIFF(SECOND, '2017-01-01 09:17:45', '2017-03-07 17:06:24')/86400) AS Real_days 
## Extracted Hours/minutes/seconds from diff ## 
    ,SEC_TO_TIME(TIMESTAMPDIFF(SECOND, '2017-01-01 09:17:45', '2017-03-07 17:06:24') % 86400) AS Real_hours_minutes_seconds 

################################### 
## Demo of wrong values returned ## 
################################### 
    ,TIMESTAMPDIFF(SECOND, '2017-01-01 09:17:45', '2017-03-07 17:06:24') AS Real_seconds_diff 

## WRONG value returned. 5.64M is truncated to 3.02 ! ## 
    ,TIME_TO_SEC(SEC_TO_TIME(5644119)) AS WRONG_result 

## Result is effectively limited to 838h59m59s ## 
    ,SEC_TO_TIME(TIMESTAMPDIFF(SECOND, '2017-01-01 09:17:45', '2017-03-07 17:06:24')) AS Limit_hit 

## Lights on said limit ## 
    ,SEC_TO_TIME(3020398) AS Limit_value_check1 
    ,SEC_TO_TIME(3020400) AS Limit_value_check2 
相關問題