2009-10-08 40 views
5

Vấn đề ngu ngốc dễ dàng, nhưng tôi không thể tìm được giải pháp thanh lịch. Tôi muốn lưu trữ khoảng thời gian trong một cột MySQL, ví dụ:Cách tốt nhất để lưu trữ các giá trị khoảng thời gian trong MySQL?

1:40 (trong một giờ, 40 phút) 0:30 (30 phút).

Sau đó, có thể chạy truy vấn, tổng hợp chúng. Ngay bây giờ tôi lưu trữ chúng như là các giá trị INT (1.40), nhưng tôi phải tự làm việc bổ sung (trừ khi tôi đang thiếu một cách dễ dàng hơn).

Loại cột TIME chỉ lưu trữ tối đa 900 giờ (về, tôi nghĩ), vì vậy đó là (gần như) vô dụng đối với tôi vì tôi đang theo dõi hàng trăm nghìn giờ (tôi lưu trữ một trường với tổng kết nhiều mục).

Cảm ơn!

Trả lời

8

lưu trữ chỉ vài phút, vì vậy 1:40 được lưu trữ là 100. điều này làm cho việc bổ sung dễ dàng: 100 + 30 = 130. khi bạn hiển thị, làm phép tính để chuyển đổi về giờ: phút. 130 phút -> 2:10.

+0

Tôi đã thực hiện một điều tương tự trong một trong các ứng dụng của mình, tuy nhiên tôi lưu trữ các giây thay vì vậy tổng của tôi không mất tất cả những phút đó. –

+2

có, nếu bạn cần theo dõi giây, sau đó thực hiện giây. nhưng câu hỏi chỉ hỏi về phút. – longneck

4

Tôi chỉ đơn giản là lưu trữ chúng trong một trường INT là giây hoặc phút (hoặc bất kỳ giá trị thời gian thấp nhất bạn đang làm việc với).

Ví dụ, bạn muốn để lưu trữ các giá trị thời gian sau 1 giờ 34 phút 25 giây:

Đó là 5665 giây. Vì vậy, chỉ lưu trữ các giá trị như 5665 trong một trường INT

Sau đó, cho phép nói rằng bạn muốn để lưu trữ các giá trị thời gian 56 phút 7 giây:

Đó là 3367 giây.

Sum lên tất cả mọi thứ sau: 5665 + 3367 = 9032 giây

Chuyển đổi lại cho rằng giờ, phút, giây, bạn sẽ có được 2 giờ 30 phút 32 giây. Có, bạn phải làm toán để thực hiện chuyển đổi, nhưng nó là một phép tính rất đơn giản và nó không phải ở tất cả các máy chuyên sâu kể từ khi bạn chỉ làm một lần, hoặc trước khi bạn lưu trữ INT hoặc một lần, sau khi bạn lấy INT.

4

Bạn chắc chắn có thể sử dụng một trường int cho điều này, đặc biệt là kể từ MySQL cung cấp các chức năng DATE_ADDDATE_SUB cho đơn vị sử dụng số nguyên của thời gian cùng với ngày tháng và datetime loại trong ngày artihmetic.

Ví dụ, nếu bạn có một cột datetime eventDateTime và bạn có một cột thời gian durationMinutes bạn có thể tính toán datetime chấm dứt sử dụng:

DATE_ADD(eventDateTime,INTERVAL durationMinutes MINUTE) 
+0

Tốt, bạn cũng hiển thị truy vấn – Va1iant

0

Nếu bạn muốn lưu trữ chúng như giờ, và do đó giữ nguyên nhỏ, bạn có thể lấy số phút và chia cho 60.

Vì vậy 1:40 trở thành 100/60 = 1,66,: 30 trở thành 30/60 = 0,5.Bây giờ bạn chỉ có thể thêm chúng một cách thông thường:

1.66 + .5 = 2.16 

và sau đó bạn có số giờ như toàn bộ, và phần thập phân là số phút trên 60, vì vậy đó sẽ là

.16 * 60 = 10 

vì vậy nó là 2:10

Tùy chọn tốt nhất tiếp theo của bạn là xem liệu MySQL có thể làm base60 hay không.

+1

Khi lưu giờ làm giá trị thả nổi, bạn có thể gặp phải lỗi làm tròn, e. g. 100 phút * không * chính xác 1,66 giờ. Với các hoạt động tiếp theo, lỗi của bạn sẽ lớn hơn. – joschi

+0

Tại sao nổi? Chỉ cần lưu trữ giây, nếu bạn muốn giây. Ngay cả 32 bit là đủ cho điều này, và bạn sẽ không nhận được vào làm tròn lỗi. Trong mili giây, có các loại int 64 bit (BIGINT cho hầu hết các cơ sở dữ liệu SQL). – Frizi

+0

Không giây, phút. Và op đã yêu cầu một cách để lưu trữ số lượng thời gian với giờ làm cơ sở (vì vậy số phút sẽ là phần cơ sở). Thậm chí không nhớ tại sao phao có vẻ lý tưởng. – Anthony

0

Tôi biết đây không phải là khoảng thời gian bạn đang nói, khi tôi tìm kiếm xung quanh đây là câu hỏi liên quan đến SO duy nhất tôi tìm thấy, để giúp đỡ những linh hồn bị mất khác như bản thân mình, tôi nghĩ mình sẽ đăng những gì tôi đang làm bây giờ.

Tôi đang lưu trữ một thời gian đăng ký, trong đó chứ không phải là giá trị chính xác như "số giây" hoặc thậm chí vài phút là một trong hai Ngày hoặc Tháng. Vì vậy, trong trường hợp của tôi, tôi có một "thời gian" INT và một "duration_unit" ENUM của ('ngày', 'tháng').

Vì vậy, đối với đăng ký "6 tháng" thay vì tính toán số phút trong 6 tháng (thay đổi tùy theo 6 tháng bạn đang nói), tôi chỉ lưu trữ "6" và "tháng".

Với phương thức mktime() của PHP, việc tính toán khoảng thời gian là +6 tháng trở nên dễ dàng và chính xác hơn.

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