2009-07-12 32 views
22

Tôi đã sử dụng dấu thời gian unix trong suốt cuộc đời của mình.Thực tiễn tốt nhất để lưu trữ ngày trong MySQL từ PHP

Tôi thích nó vì nó dễ so sánh, nhanh vì tôi lưu trữ dưới dạng số nguyên. Và kể từ khi tôi đang sử dụng PHP, tôi có thể nhận được bất kỳ định dạng ngày/giờ nào với hàm date() từ unixtimestamp.

Bây giờ, một số người nói rằng tốt nhất là sử dụng định dạng DATETIME. Nhưng bên cạnh cái tên phù hợp hơn, tôi không thấy bất kỳ lợi thế nào.

Có thực sự tốt hơn để sử dụng DATETIME, nếu có, lợi thế là gì?

Cảm ơn.

Trả lời

28

Nếu bạn lưu trữ ngày dưới dạng dấu thời gian của Unix trong cơ sở dữ liệu, bạn sẽ tự nâng cấp nặng nề. Bạn phải chuyển đổi chúng sang các định dạng bạn muốn sử dụng, bạn phải thực hiện các phép tính giữa các phạm vi ngày, bạn phải tạo các truy vấn để lấy dữ liệu trong một phạm vi. Điều này có vẻ phản trực giác- chắc chắn "thời gian lập trình" của bạn là tốt nhất dành giải quyết vấn đề thực sự? Có vẻ như thực hành tốt hơn để lưu trữ ngày và giờ theo định dạng thích hợp mà MySQL có sẵn, sau đó sử dụng các hàm cơ sở dữ liệu để tạo truy vấn cho dữ liệu bạn muốn. Thời gian bạn sẽ lãng phí làm tất cả các hội nghị và mucking về là lớn so với buổi chiều dành đọc (và sự hiểu biết) 11.6 MySQL Date and Time Functions

+0

Tôi đã chỉnh sửa. :) – treznik

+1

Tôi không đồng ý. Kiểm tra câu trả lời của tôi. – coderama

+0

Trường DATETIME của MySQL thiếu múi giờ - luôn lưu trữ ngày trong UTC (tức là tránh NOW() - sử dụng UTC_TIMESTAMP()) nếu không bạn sẽ gặp rắc rối lớn khi cố gắng quốc tế hóa ứng dụng của mình và thay đổi lý do * múi giờ máy chủ của bạn. – jmc

7

Một lợi thế của việc sử dụng MySQL date/time types là có thể đơn giản sử dụng date/time functions in MySQL.

Loại DATE cũng có lợi thế là chỉ lưu trữ ngày, tháng và năm để không có không gian lãng phí hoặc so sánh phức tạp mà một giây kể từ thời gian epoch sẽ có trong các tình huống mà bạn chỉ quan tâm trong ngày chứ không phải thời gian.

Cá nhân tôi có xu hướng sử dụng cơ sở dữ liệu như một bãi chứa dữ liệu để các chức năng như vậy ít được quan tâm. Trong PHP tôi có xu hướng chỉ lưu trữ ngày ở định dạng số nguyên cho khá nhiều lý do bạn nói.

1

Dễ dàng hơn để so sánh và mysql cung cấp nhiều chức năng ngày tháng.

2

Bảo trì dễ dàng hơn là điểm cộng. Nhìn thấy ngày thực tế khi bạn làm:

select * from table where ... 

là khá hay.

3

Sử dụng datetime cơ sở dữ liệu là hiệu quả hơn vì mỗi khi bạn cần truy vấn bạn sẽ cần phải áp dụng from_unixtime() chức năng trích xuất dữ liệu từ cột thống nhất unix của bảng. Sử dụng hàm này trong mệnh đề where sẽ hoàn toàn bỏ qua bất kỳ cách sử dụng chỉ mục nào.

nói truy vấn của tôi là:

chọn col1, col2, colUnixdatetime từ bàn nơi colUnixdatetime giữa wtvdate1 và wtvdate2

tôi sẽ cần phải chạy:

chọn col1, col2, colUnixdatetime từ bàn nơi Từ_Unixtime (colUnixdatetime) giữa wtvdate1 và wtvdate2

Truy vấn trên sẽ hoàn toàn bỏ qua bất kỳ chỉ mục nào, cũng không sử dụng chỉ mục ở đây vì chúng sẽ không bao giờ được sử dụng coz. e một chức năng để có được thời gian ngày thực tế.

Mọi chức năng trong xây dựng được sử dụng trên LHS của điều kiện trong mệnh đề where sẽ không sử dụng bất kỳ chỉ mục nào và nếu bạn có bảng HUGE, truy vấn của bạn sẽ mất nhiều thời gian hơn.

6

@Smita V, truy vấn không hiệu quả mà bạn giới thiệu chỉ vì bạn đang áp dụng hàm chuyển đổi không chính xác cho mỗi hàng trong bảng, nơi bạn nên áp dụng nó cho chính điều kiện. Vì vậy, thay vì

select col1,col2,colUnixdatetime from table where From_Unixtime(colUnixdatetime) between wtvdate1 and wtvdate2 

, chuyển đổi mọi hàng trên bàn để so sánh mọi hàng trên bảng so với ngày bạn có. Bạn nên sử dụng

select col1,col2,colUnixdatetime from table where colUnixdatetime between UNIX_TIMESTAMP(wtvdate1) and UNIX_TIMESTAMP(wtvdate2). 

Làm theo cách này S W sử dụng chỉ mục bảng thích hợp.

@treznik cách đây một lúc tôi đã chuyển từ số nguyên uts sang kiểu dữ liệu datetime hoặc dấu thời gian, vì những lý do đã đề cập ở trên, dễ đọc và thao tác hơn nhiều.). Tuy nhiên tôi đã gần đây đã bắt đầu suy nghĩ lại về cách tiếp cận này vì hai lý do:

  1. Không có vị trí múi giờ được lưu trữ, vì vậy bạn suy luận múi giờ dựa trên vị trí của bạn. Điều này có thể hoặc không có thể là một vấn đề cho bạn.
  2. Nó bỏ qua thời gian tiết kiệm ánh sáng ban ngày. Vì vậy, khi đồng hồ quay trở lại lúc 2 giờ sáng, bạn sẽ nhận được 1:30 sáng hai lần và nói rằng 2011-10-30 01:30 không cho bạn biết điều này, trong khi 1319938200 có. Tôi không nghĩ rằng có một cách bản địa trong mysql để lưu trữ ngày bao gồm cả múi giờ, ngoại trừ một chuỗi (2011-10-30 01:30 BST).

Tôi vẫn đang cố gắng tìm ra câu trả lời cho chính bản thân mình.

+0

Nói cho tôi biết về điều đó, không thể tin rằng nó đã gần 3 năm trước. Tôi cũng chuyển sang datetime không lâu sau khi tôi bắt đầu chủ đề này, nhưng không bao giờ thực sự bị thuyết phục đó là sự lựa chọn đúng đắn. Tôi liên tục gặp phải những vấn đề tương tự mà bạn nói và tôi vẫn nghĩ rằng dấu thời gian là sự lựa chọn tối thượng. Nhưng tôi đoán đôi khi, vì lợi ích của việc hoàn thành công việc, chúng ta cần phải đưa vào và đi với các giải pháp thiết thực nhất. – treznik

+1

Mặc dù ngày giờ không có múi giờ, chúng tôi lưu trữ ngày dưới dạng UTC và chuyển đổi thành múi giờ thích hợp trong lớp ứng dụng hoặc bằng cách sử dụng convert_tz(). Điều này giải quyết cả hai vấn đề của bạn. – SuperGreg

+1

Ngoài ra, tôi nghĩ rằng datetime thực sự đáng tin cậy hơn so với dấu thời gian, vì tôi biết giá trị luôn chính xác những gì tôi đã lưu trữ (UTC), trái ngược với dấu thời gian nơi nó được lưu dưới dạng UTC nhưng được chuyển đổi thành múi giờ của máy chủ (có thể thay đổi) . – SuperGreg

8

Tôi cũng là một fan hâm mộ lớn của dấu thời gian unix trong suốt cuộc đời của tôi. Nhưng tôi nghĩ câu trả lời đúng là: "phụ thuộc". Gần đây tôi đã làm một cơ sở dữ liệu bảng duy nhất mà tôi muốn chỉ liệt kê các URL. Sẽ có trường ngày, nhưng trường ngày tháng hoàn toàn là để phân loại. I.đơn đặt hàng của last_crawled. Điều đó có nghĩa là tôi sẽ không bao giờ sử dụng bất kỳ chức năng ngày tháng được xây dựng trong lĩnh vực đó. Nó chỉ đơn thuần là một cách dễ dàng để có được các mục cũ nhất trước và tôi sẽ không bao giờ áp dụng các hàm ngày tháng cho trường này. Bây giờ, có tôi làm lĩnh vực một ngày này, tôi sẽ bị mất ra vào hai điều:

  1. Một lĩnh vực datetime là gấp đôi so với kích thước của một số nguyên
  2. Phân loại theo một số nguyên là nhanh hơn (không chắc chắn 100% này, pending outcome of this question)

Tuy nhiên, đối với hệ thống khác, tôi phải lưu trữ thông tin giao dịch. Điều này được thực hiện bằng cách sử dụng internal mysql date functions có thể hóa ra là rất hữu ích khi chúng tôi phải bắt đầu thực hiện báo cáo.

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