บันทึกการประทับเวลาในตาราง mysql โดยใช้ php


95

ฉันมีฟิลด์ในตาราง MySQL ซึ่งมีtimestampชนิดข้อมูล ฉันกำลังบันทึกข้อมูลลงในตารางนั้น แต่เมื่อฉันส่ง timestamp ( 1299762201428) ไปยังระเบียนมันจะบันทึกค่า0000-00-00 00:00:00ลงในตารางนั้นโดยอัตโนมัติ

ฉันจะจัดเก็บการประทับเวลาในตาราง MySQL ได้อย่างไร

นี่คือINSERTคำสั่งของฉัน:

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
คุณกำลังพูดถึงการประทับเวลาใด คุณเอามาจากไหน?
สามัญสำนึกของคุณ

1
คุณวางโครงสร้างตารางของคุณที่นี่ได้ไหม

คำตอบ:


162

ผ่านแบบนี้

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

7
แต่ค่าที่คุณได้รับในฐานข้อมูลแสดงประเภทคอลัมน์คือdatetimeถ้าคุณต้องการเปลี่ยนให้timestampเปลี่ยนประเภทคอลัมน์เป็นvarchar(15)
jimy

2
จากนั้นวางไว้บนฟิลด์ INT อย่างไรก็ตามการประทับเวลาเป็นเพียงการแสดงวันที่เท่านั้นและในทางกลับกัน คุณสามารถแปลงจากการประทับเวลาวันที่มีฟังก์ชั่น Jimy บอกคุณและวิธีอื่น ๆ strtotimeที่มี แก้ไข: btw การประทับเวลาครอบคลุมเฉพาะช่วงวันที่ที่เป็นไปได้ทั้งหมด (1970-01-01 ถึง xx-xx-2032 ฉันคิดว่า)
Carlos Campderrós

4
แล้วการใช้ประเภทข้อมูลการประทับเวลาคืออะไร? ฟิลด์ s_time มีประเภทข้อมูลการประทับเวลา ฉันบันทึก 1299762201428 ลงในช่องนั้นไม่ได้หรือ
gautamlakum

@ lakum4stackof: สำหรับประเภทข้อมูลการประทับเวลาโปรดดูรายละเอียดที่dev.mysql.com/doc/refman/5.0/en/timestamp.html
RollingBoy

1
@ lakum4stackof - การใช้ timestamp คือคุณจะบันทึกการประทับเวลา แต่จะแสดงเป็นวันที่เท่านั้น ภายใน (เป็นข้อมูลทุกประเภท) จะถูกจัดเก็บเป็นจำนวนเต็มลงนาม หากคุณต้องการจัดรูปแบบการประทับเวลานั้นเป็นจำนวนเต็มฉันขอแนะนำให้คุณใช้ฟิลด์ INT จากนั้น การใช้คอลัมน์การประทับเวลาคือการจัดการวันที่ (การเพิ่มช่วงเวลาเป็นต้น)
Michael JV

53

เฮ้ใช้FROM_UNIXTIME()ฟังก์ชั่นนี้

แบบนี้:

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')

ทำไมถึงดีกว่านี้date('Y-m-d H:i:s','1299762201428')?
Yuri

5
พิมพ์ความปลอดภัย: FROM_UNIXTIMEให้ประเภทวันที่ mysql ดั้งเดิมในขณะที่ php date()ส่งคืนสตริง
Richard Tuin

5
จะดีกว่าเพราะเว็บเซิร์ฟเวอร์ (PHP) และ MySQL อาจอยู่คนละที่กัน ดังนั้นวันที่ ('Ymd H: i: s', '1299762201428') จะตั้งค่า TimeZone ของเว็บเซิร์ฟเวอร์ ด้วยเว็บเซิร์ฟเวอร์ที่แตกต่างกันในโซนต่างๆคุณจะมีข้อมูลที่ไม่สอดคล้องกัน หรือในรหัสของคุณคุณต้องบังคับให้เขตเวลาของแอปพลิเคชันเป็นเขตเวลาของ MySQL date_timezone_set
Ostico


15

สิ่งที่ต้องชี้แจง:

  • ประเภทเขตข้อมูลการประทับเวลา MySQL ไม่ได้จัดเก็บการประทับเวลาของยูนิกซ์ แต่เป็นค่าชนิดวันที่และเวลา
  • การประทับเวลา UNIX เป็นประเภท int ปกติจำนวนหนึ่ง
  • การประทับเวลาที่คุณกำลังพูดถึงไม่ใช่การประทับเวลาแบบยูนิกซ์ทั่วไป แต่เป็นการประทับเวลาที่มีหน่วยมิลลิวินาที

ดังนั้นคำตอบที่ถูกต้องจะเป็น

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


3

คุณสามารถใช้now()เช่นกันในแบบสอบถามของคุณเช่น:

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

จะใช้การประทับเวลาปัจจุบัน


2

ฉันคาดเดาว่าข้อมูลที่คุณกำลังพยายามที่จะประหยัดค่าในเป็นเขต datetime ก็ไม่เดียวกัน แต่ดูเหมือนว่าจะเป็นจริงสำหรับการประทับเวลา หากเป็นเช่นนั้น mysql คาดว่ารูปแบบจะเป็น Year-month-day Hour: minute: second ในการบันทึกการประทับเวลาคุณจะต้องแปลงฟิลด์เป็นตัวเลขโดยใช้แบบสอบถามเช่น

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

หากคุณกำลังใช้เวลาปัจจุบันคุณสามารถใช้ now () หรือ current_timestamp


1

ใช้FROM_UNIXTIME().

หมายเหตุ: 1299762201428 ดูเหมือนการประทับเวลาในระดับมิลลิวินาที (เช่น Date () * 1 ใน JavaScript) และคุณอาจต้องหารด้วย 1,000


1

ตรวจสอบประเภทฟิลด์ในตารางเพียงแค่บันทึกค่าการประทับเวลาในประเภทข้อมูลเช่น bigintเป็นต้น

ไม่ใช่datetimeประเภท



0

หากการประทับเวลาเป็นเวลาปัจจุบันคุณสามารถใช้NOW()ฟังก์ชันmysql


0

ใช้datetimeประเภทฟิลด์ มันมาพร้อมกับข้อได้เปรียบหลายอย่างเช่นการอ่านของมนุษย์ (ไม่มีคนอ่าน timestamps) และฟังก์ชั่น MySQL

FROM_UNIXTIME(1299762201428)การแปลงจากประทับเวลายูนิกซ์คุณสามารถใช้ฟังก์ชั่น MySQL ในการแปลงกลับคุณสามารถใช้UNIX_TIMESTAMP: SELECT UNIX_TIMESTAMP(t_time) FROM table_name.

แน่นอนถ้าคุณทำไม่ได้เช่นฟังก์ชั่น MySQL, คุณก็สามารถใช้ 'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp)PHP:


timestamp ชนิดของฟิลด์เป็นคนอ่านมากเกินไป (เมื่อใช้SELECTในคอนโซล) พวกเขาแตกต่างกันมากและทั้งคู่มีข้อดี / ข้อเสีย ความแตกต่างที่สำคัญคือวิธีจัดการโซนเวลา
Udo G

@ อูโดจี: คุณถูกต้อง แต่ฉันยังชอบdatetimeด้วยเหตุผลหลายประการ ข้อเสีย / ข้อได้เปรียบที่ใหญ่ที่สุดในความคิดของคุณคืออะไร?
Znarkus

ข้อได้เปรียบที่ใหญ่ที่สุดสำหรับtimestamp: ตรงกับการประทับเวลาของ PHP ได้ดีขึ้นเนื่องจากไม่มีภูมิคุ้มกันต่อการตั้งค่าโซนเวลาของทั้งเซิร์ฟเวอร์และไคลเอนต์ในขณะที่datetimeการเปลี่ยนแปลงค่าที่แสดงขึ้นอยู่กับเขตเวลาของไคลเอนต์ MySQL ของคุณ (แน่นอนขึ้นอยู่กับโครงการของคุณซึ่ง หนึ่งดีกว่า) ข้อเสียที่ใหญ่ที่สุดสำหรับtimestamp: ไม่รองรับค่า NULL และ (ฉันไม่รู้ว่าพวกเขาสูบบุหรี่อะไรเมื่อพวกเขาตั้งโปรแกรมสิ่งนี้) TIMESTAMP NOT NULLฟิลด์จะกลายเป็นไฟล์TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP. ในกรณีของฉันฉันต้องใช้TIMESTAMPด้วยเหตุผล TZ
Udo G

0

varchar(15)ที่ดีกว่าคือการใช้ประเภทข้อมูล


3
การบันทึกตัวเลขในรูปแบบของสตริงมักจะไม่ใช่เรื่องที่ดีนักเนื่องจากสตริงจะเปรียบเทียบได้ช้ากว่าและคำนวณได้ยากกว่า
RollingBoy

คะแนนโหวตของฉันไปที่ int ที่ไม่ได้ลงนาม - แต่ไปลงที่โพรงกระต่ายกันเถอะ ทำไมต้อง varchar ไม่ใช่ถ่าน? มันเป็นรายการที่มีความยาวคงที่ - การเพิ่มประสิทธิภาพไมโคร แต่ก็ยัง ...
BradChesney79


-1

ถ้าฉันรู้ว่าฐานข้อมูลคือ MySQL ฉันจะใช้ฟังก์ชัน NOW () ดังนี้:

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

สิ่งนี้จะจัดเก็บการประทับเวลาปัจจุบันเท่านั้นไม่ใช่สิ่งที่ OP ขออย่างเคร่งครัด
charliefortune
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.