2012-12-04 53 views
13

Làm cách nào để tôi có thể làm tròn thời gian trong MySQL đến 15 phút gần nhất (ví dụ: 0,15,30,45)?Cách làm tròn thời gian tới đoạn 15 phút gần nhất

+1

Bạn có thể cho chúng tôi biết bất kỳ điều gì bạn đã làm cho đến thời điểm này không? :-) Sau đó, chúng tôi có thể đề xuất cho phù hợp. – bonCodigo

+0

Tại sao không sử dụng 'timestampdiff' bằng' mod'? Btw Tôi lấy bình luận trước đây của tôi khi tôi ddnt nhận thấy câu trả lời là do bạn. Bạn có thể vừa cập nhật câu hỏi của mình bằng cách thêm mã :-) – bonCodigo

Trả lời

17
SELECT SEC_TO_TIME(FLOOR((TIME_TO_SEC(CURTIME())+450)/900)*900) 

Trong ví dụ này tôi đã sử dụng CURTIME() cho thời gian nhập, nhưng bạn có thể sử dụng bất kỳ trường thời gian nào.

900 giây = 15 phút (khoảng thời gian để làm tròn), 450 giây bằng một nửa (để cung cấp phần tử làm tròn). Tôi đã thử nghiệm với 1800/900 để có được nửa giờ gần nhất, nên làm việc với những người khác (600/300 trong 10 phút vv).

0

Dưới đây là một số mã thô mà tôi đã sử dụng có kết quả thực sự gần với những gì tôi muốn. Bởi vì tôi đã không sử dụng giây tôi chỉ cần chọn phút gần điểm nửa chiều.

SELECT 
     CASE 
      WHEN minute(timeIn) BETWEEN 0 and 7 THEN SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600) 
      WHEN minute(timeIn) BETWEEN 8 and 22 THEN ADDTIME(SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600), '00:15:00') 
      WHEN minute(timeIn) BETWEEN 23 and 37 THEN ADDTIME(SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600), '00:30:00') 
      WHEN minute(timeIn) BETWEEN 38 and 52 THEN ADDTIME(SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600), '00:45:00') 
      WHEN minute(timeIn) BETWEEN 53 and 59 THEN ADDTIME(SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600), '01:00:00') 
     END as 15_min 
    FROM 
     clock.punches; 
12
SELECT FROM_UNIXTIME(TRUNCATE(UNIX_TIMESTAMP(NOW())/900,0)*900); 

này có thể được khái quát hóa để làm tròn đến bất kỳ giá trị thời gian. 900 giây = 15 phút. Bạn có thể thay thế 900 bằng bất kỳ yếu tố làm tròn nào khác.

+0

Có thể thay đổi 900 thành bất kỳ khoảng thời gian nào nhưng mã bạn đã cung cấp một mình sẽ luôn làm tròn xuống. – donL

+1

sử dụng CEIL() thay vì TRUNCATE() –

+2

Để có kết quả tốt hơn (nhanh hơn) sử dụng [chia số nguyên] (http://dev.mysql.com/doc/refman/5.0/en/arithmetic-functions.html#operator_div) (mà làm tròn xuống, không lên nhưng điều đó không quan trọng) - hoặc trừ 'MOD 900' từ số thay vì chia và nhân. – Ariel

Các vấn đề liên quan