2012-11-12 23 views
6

Tôi cần một phương pháp để lưu trữ một khoảng thời gian trong một trường db. Tôi đang xây dựng một trang web nơi khách hàng có thể chọn thời gian họ muốn quảng cáo hiển thị từ một ngày bắt đầu cụ thể.Whats cách tốt nhất để lưu trữ một khoảng thời gian trong một MySQL lớn hơn phạm vi TIME là bao nhiêu?

Tôi đã nghĩ đến việc sử dụng TIME nhưng có tối đa là '838: 59: 59' hoạt động trong khoảng 34 ngày. Có thể là một khách hàng sẽ muốn một quảng cáo tồn tại lâu hơn thế.

Vì vậy, cách tốt nhất để giải quyết vấn đề này là gì? Chỉ là một INT thực sự lớn?

+0

Tại sao không ghi lại thời gian bắt đầu và kết thúc trong hai cột? – eggyal

+0

Đây là kế hoạch ban đầu của tôi nhưng được chứng minh là khá khó hiểu khi cố gắng tìm ra các khía cạnh khác của trang web, lưu trữ thời lượng sẽ sạch hơn tôi nghĩ. – cosmicsafari

+0

Bạn sẽ lưu trữ thời gian của mình vào đơn vị nào? giây? phút? ngày? có thể giúp bạn quyết định kiểu dữ liệu – mwangi

Trả lời

6

Nếu bạn có ý định có một cột cho thời gian bắt đầu và một cho thời gian, tôi nghĩ bạn có thể lưu trữ nó trong vài giây. Vì vậy, tôi giả sử bạn sẽ có một cái gì đó như thế này;

+-----------+--------------------------+------------------+ 
| advert_id | start_time    | duration_seconds | 
+-----------+--------------------------+------------------+ 
| 2342342 |'2012-11-12 10:23:03'  | 86400   | 
+-----------+--------------------------+------------------+ 

(Vì lợi ích của ví dụ này, chúng tôi sẽ gọi bảng này adverts)

  1. advert_id - một trỏ chìa khóa để quảng cáo của bạn
  2. start_time - thời điểm quảng cáo nên bắt đầu (kiểu dữ liệu - TIMESTAMP)
  3. duration_seconds - Thời gian tính bằng giây mà quảng cáo được cho là "hoạt động" (INTEGER (11)

    S ELECT TIME_TO_SEC (timediff (now(), start_time)) là 'time_difference_in_seconds_since_advert_started' FROM adverts;

Nếu bạn muốn chỉ nhận được quảng cáo chưa hết hạn, bạn sẽ chạy truy vấn như thế này;

SELECT * FROM `adverts` WHERE TIME_TO_SEC(timediff(now(),start_time))<=`duration_seconds`; 

Đó là một cách tôi sẽ làm nếu tôi đi với trường "thời lượng".

+1

Đây chính xác là những gì tôi đang nói đến, nhưng đó là nhiều việc phải làm với loại trường tốt nhất là lưu trữ nó thay vì ứng dụng làm như thế. Như DevArt đã đề cập ở trên, tôi có thể sử dụng BIGINT để giải quyết vấn đề phạm vi TIME. Cảm ơn câu trả lời mặc dù, nó rất tốt bằng văn bản.^_^ – cosmicsafari

+0

Ok cosmicsafari. Đừng quên chọn nó làm câu trả lời chính xác;) – mwangi

0

không phải là giải pháp tốt nhất nhưng bạn có thể thêm một cột vào db của mình và kiểm tra thời gian trên 24 giờ, tính thời gian là 1 ngày và viết cột đó và tất cả thời gian còn lại viết trong cột thời gian. Nhưng chọn từ db, bạn cũng nên tính cột đó trong ngày

1

Có, bạn có thể lưu trữ thời gian dưới dạng kiểu dữ liệu INT (hoặc một số nguyên lớn khác: MEDIUMINT, LONGINT). Sau đó, sử dụng bạn có thể dễ dàng có được ngày và thời gian một phần từ điều này, ví dụ: -

SELECT time DIV 86400 AS days, SEC_TO_TIME(column1 MOD 86400) AS time FROM table 

Trường hợp 86400 là số giây trong 24h (60 * 60 * 24 = 86400).

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