Lưu dấu thời gian trong bảng mysql bằng php


94

Tôi có một trường trong bảng MySQL có timestampkiểu dữ liệu. Tôi đang lưu dữ liệu vào bảng đó. Nhưng khi tôi chuyển dấu thời gian ( 1299762201428) vào bản ghi, nó sẽ tự động lưu giá trị 0000-00-00 00:00:00vào bảng đó.

Làm cách nào để lưu trữ dấu thời gian trong bảng MySQL?

Đây là INSERTtuyên bố của tôi :

INSERT INTO table_name (id,d_id,l_id,connection,s_time,upload_items_count,download_items_count,t_time,status)
VALUES (1,5,9,'2',1299762201428,5,10,20,'1'),
       (2,5,9,'2',1299762201428,5,10,20,'1')

1
Bạn đang nói về dấu thời gian nào? Bạn có nó ở đâu?
Common Sense của bạn

1
u có thể dán cấu trúc bảng ur ở đây?

Câu trả lời:


160

vượt qua như thế này

date('Y-m-d H:i:s','1299762201428')

7
nhưng giá trị mà bạn nhận được trong chương trình db loại cột là datetime, nếu bạn muốn thay đổi nó để timestampsau đó thay đổi kiểu cộtvarchar(15)
Jimy

2
Sau đó đặt nó vào trường INT. Dù sao, dấu thời gian chỉ là đại diện của ngày tháng và ngược lại. Bạn có thể chuyển đổi từ dấu thời gian sang ngày tháng với hàm jimy đã nói với bạn và theo cách khác với strtotime. chỉnh sửa: btw, dấu thời gian chỉ bao gồm một loạt tất cả các ngày có thể có (tôi nghĩ là 1970-01-01 đến xx-xx-2032)
Carlos Campderrós

4
vậy việc sử dụng kiểu dữ liệu dấu thời gian là gì? trường s_time có kiểu dữ liệu dấu thời gian. Tôi không thể lưu 1299762201428 vào trường đó?
gautamlakum

@ lakum4stackof: Đối với loại dữ liệu dấu thời gian, vui lòng tham khảo dev.mysql.com/doc/refman/5.0/en/timestamp.html để biết thêm chi tiết.
RollingBoy

1
@ lakum4stackof - việc sử dụng dấu thời gian là bạn lưu dấu thời gian, nhưng nó chỉ được hiển thị dưới dạng ngày tháng. Trong nội bộ (như tất cả các kiểu dữ liệu), nó được lưu trữ dưới dạng số nguyên có dấu. Nếu bạn cũng muốn định dạng dấu thời gian đó dưới dạng số nguyên, tôi khuyên bạn nên sử dụng trường INT sau đó. Sử dụng cột dấu thời gian là cơ chế ngày (thêm khoảng thời gian và tương tự).
Michael JV

51

Này, sử dụng FROM_UNIXTIME()chức năng này.

Như thế này:

INSERT INTO table_name
(id,d_id,l_id,connection,s_time,upload_items_count,download_items_count,t_time,status)
VALUES
(1,5,9,'2',FROM_UNIXTIME(1299762201428),5,10,20,'1'), 
(2,5,9,'2',FROM_UNIXTIME(1299762201428),5,10,20,'1')

Tại sao điều này tốt hơn date('Y-m-d H:i:s','1299762201428')?
Yuri

5
Loại an toàn: FROM_UNIXTIMEmang lại một loại ngày mysql mẹ đẻ trong khi php của date()lợi nhuận một chuỗi.
Richard Tuin

5
Nó tốt hơn vì máy chủ web (PHP) và MySQL có thể ở những nơi khác nhau. Vì vậy, date ('Ymd H: i: s', '1299762201428') sẽ đặt TimeZone của máy chủ web. Với các máy chủ web khác nhau được đặt ở các vùng khác nhau, bạn sẽ có dữ liệu không nhất quán. Ngoài ra, trong mã của bạn, bạn phải buộc múi giờ của ứng dụng theo múi giờ của MySQL. date_timezone_set
Ostico

18
$created_date = date("Y-m-d H:i:s");
$sql = "INSERT INTO $tbl_name(created_date)VALUES('$created_date')";
$result = mysql_query($sql);

15

Một số điều cần làm rõ:

  • Loại trường dấu thời gian MySQL không lưu trữ dấu thời gian unix mà là một giá trị kiểu ngày giờ.
  • Dấu thời gian UNIX là một số kiểu int thông thường.
  • Dấu thời gian bạn đang nói đến không phải là dấu thời gian unix thông thường mà là dấu thời gian có mili giây.

do đó câu trả lời chính xác sẽ là

$timestamp = '1299762201428';
$date = date('Y-m-d H:i:s', substr($timestamp, 0, -3));

3

Datatype ' bigint unsigned ' có thể phù hợp với yêu cầu này.


2

Tôi đoán rằng trường bạn đang cố gắng lưu giá trị trong đó là trường ngày giờ, nó không phải là trường nhưng điều này có vẻ đúng đối với dấu thời gian . Nếu vậy, mysql dự kiến ​​định dạng là Năm-tháng-ngày Giờ: phút: giây. Để lưu dấu thời gian, bạn sẽ phải chuyển đổi trường thành số bằng cách sử dụng truy vấn như

alter table <table_name> change <field> <field> bigint unsigned

Nếu bạn đang sử dụng thời gian hiện tại, bạn có thể sử dụng now () hoặc current_timestamp.


2

Bạn cũng có thể sử dụng now()trong truy vấn của mình, tức là:

insert into table (time) values(now());

Nó sẽ sử dụng dấu thời gian hiện tại.


1

Sử dụng FROM_UNIXTIME().

Lưu ý: 1299762201428 trông giống một dấu thời gian mili giây (giống như Date () * 1 trong JavaScript) và bạn có thể phải chia nó cho 1000.


1

Kiểm tra loại trường trong bảng chỉ lưu giá trị dấu thời gian trong kiểu dữ liệu như bigintv.v.

Không phải datetimeloại



0

Nếu dấu thời gian là thời gian hiện tại, bạn có thể sử dụng NOW()hàm mysql


0

Sử dụng datetimeloại trường. Nó đi kèm với nhiều lợi thế như khả năng đọc của con người (không ai đọc dấu thời gian) và các hàm MySQL .

Để chuyển đổi từ dấu thời gian unix, bạn có thể sử dụng hàm MySQL FROM_UNIXTIME(1299762201428). Để chuyển đổi lại bạn có thể sử dụng UNIX_TIMESTAMP: SELECT UNIX_TIMESTAMP(t_time) FROM table_name.

Tất nhiên, nếu bạn không thích hàm MySQL, bạn luôn có thể sử dụng PHP : 'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp).


Các timestamp loại hình trường là human readable quá (khi sử dụng SELECTtrong giao diện điều khiển). Chúng rất khác nhau và cả hai đều có nhược điểm / ưu điểm của chúng. Sự khác biệt chính là cách múi giờ được xử lý.
Udo G

@Udo G: Bạn nói đúng, nhưng tôi vẫn thích datetimevì nhiều lý do khác nhau. Theo bạn nhược điểm / lợi thế lớn nhất là gì?
Znarkus

ưu điểm lớn nhất là timestamp: nó phù hợp hơn với dấu thời gian PHP vì nó miễn nhiễm với cài đặt múi giờ của cả máy chủ và máy khách, trong khi datetimethay đổi giá trị hiển thị của nó tùy thuộc vào múi giờ của máy khách MySQL của bạn (tất nhiên nó phụ thuộc vào dự án của bạn, một là tốt hơn). bất lợi lớn nhất cho timestamp: nó không hỗ trợ các giá trị NULL và (tôi không biết họ đã hút gì khi họ lập trình điều này) một TIMESTAMP NOT NULLtrường trở thành a TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP. Trong trường hợp của tôi, tôi không may phải sử dụng TIMESTAMPvì lý do TZ.
Udo G

0

Tốt hơn là sử dụng kiểu dữ liệu varchar(15).


3
Lưu một số dưới dạng chuỗi thường không phải là một cách tốt, vì các chuỗi chậm hơn trong việc so sánh và khó thực hiện phép tính hơn.
RollingBoy

Phiếu bầu của tôi chuyển đến int không dấu-- nhưng chúng ta hãy đi xuống lỗ thỏ. Tại sao lại là varchar chứ không phải char? Đó là một mục nhập có độ dài cố định - tối ưu hóa vi mô, nhưng vẫn ...
BradChesney79


-1

Nếu tôi biết cơ sở dữ liệu là MySQL, tôi sẽ sử dụng hàm NOW () như sau:

INSERT INTO table_name
   (id, name, created_at) 
VALUES 
   (1, 'Gordon', NOW()) 

Điều này sẽ chỉ lưu trữ dấu thời gian hiện tại, không đúng những gì OP đang yêu cầu.
charlie xui xẻo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.