Datetime vs Timestamp ใน MySQL และ PHP ในทางปฏิบัติ


24

ฉันไม่แน่ใจว่าจะระบุประเภทข้อมูลของฉันเป็น datetime หรือ timestamp ฉันคิดว่าฉันจะต้องการทั้งสองอย่าง แต่ในเหตุการณ์ที่แตกต่างกัน เว็บไซต์ของฉันขายสินค้าและบริการทั่วโลกและยังมีระบบบัญชีสำหรับผู้ใช้เพื่อเข้าสู่ระบบ กรุณาชี้แจงต่อไปนี้:

  • วันที่และเวลาปัจจุบันที่ลูกค้าซื้อผลิตภัณฑ์จากเว็บไซต์ของฉัน: วันที่และเวลา
  • วันที่และเวลาจัดส่งตามสถานที่และวันที่ / เวลาที่จัดซื้อคำนวณจากระบบของเรา: วันที่และเวลา
  • ครั้งล่าสุดที่พวกเขาลงชื่อเข้าใช้บัญชี: Timestamp?

    1. รหัสใน php เพื่อจัดเก็บวันที่ซื้อ (วันที่ปัจจุบัน) จากนั้นเก็บไว้ในฐานข้อมูลคืออะไร?
    2. โปรดอธิบายวิธีใช้แต่ละอย่างให้ละเอียดหลังจากอ่านคำอธิบายมากมายบนอินเทอร์เน็ตฉันยังไม่เข้าใจเลย

ในขณะที่ฉันมีโครงการขนาดใหญ่ที่ประสิทธิภาพเป็นสิ่งจำเป็นอย่างยิ่งหลังจากเดือนของการวิจัยเราลงเอยด้วยเวลา UTC ที่เก็บไว้ในเขตข้อมูล varchar มันพิสูจน์แล้วว่าเร็วขึ้นและดีขึ้นสำหรับความต้องการของเรา (เครือข่ายสังคมขนาดใหญ่)
JasonDavis

คำตอบ:


29

MySQL บันทึกเวลา :

  • ถูกเก็บไว้ในUTC

    ข้อมูลเหล่านี้จะถูกแปลงเป็น UTC ในที่เก็บข้อมูลและแปลงกลับเป็นโซนเวลาของคุณเมื่อรับข้อมูล หากคุณเปลี่ยนการตั้งค่าเขตเวลาค่าที่ดึงมาก็จะเปลี่ยนไป

  • สามารถเริ่มต้นและอัพเดทได้โดยอัตโนมัติ

    คุณสามารถตั้งค่าเริ่มต้นและ / หรือค่าการอัปเดตอัตโนมัติเป็น CURRENT_TIMESTAMP

  • มีช่วงของ1970-01-01 00:00:01 UTCการ2038-01-19 03:14:07 UTC

ในขณะที่ MySQL datetime :

  • สิ่งที่คุณเก็บไว้คือสิ่งที่คุณได้รับ™

  • มีช่วงของ1000-01-01 00:00:00การ9999-12-31 23:59:59

    ค่าที่อยู่นอกช่วงอาจทำงานได้ แต่รับประกันเฉพาะค่าภายในช่วงที่จะทำงาน

  • คุณสามารถจัดเก็บวันที่ซึ่งวันหรือเดือนเป็นศูนย์

    นี่เป็นวิธี MySQL ในการจัดเก็บวันเกิด! คุณไม่สามารถทำเช่นนั้นกับมีข้อยกเว้นเพียงเป็นค่าเป็นศูนย์ของTIMESTAMP0000-00-00

  • คุณสามารถจัดเก็บวันที่ไม่ถูกต้องหากต้องการในโหมดALLOW_INVALID_DATES

  • คุณสามารถตั้งค่าเริ่มต้นNOW()ในบางกรณี TIMESTAMPแต่วิธีที่นิยมและเป็นธรรมชาติมากขึ้นนับจากวันที่เริ่มต้นใช้งานโดยอัตโนมัติและมีการปรับปรุงคือ

และแน่นอนว่ายังมีDATEและTIMEที่ทำงานเหมือนDATETIMEแต่แน่นอนDATEไม่สนใจเวลาและTIMEไม่สนใจวันที่ ทั้งสี่ชนิดข้อมูลทำงานอย่างสมบูรณ์แบบด้วยหลากหลายของวันที่และเวลาการทำงานแต่เมื่อคุณกำลังผสมชนิดข้อมูลที่คุณควรจะตระหนักถึงผลกระทบการแปลง

ตอนนี้สำหรับคำถามของคุณ: คุณควรใช้DATETIMEทุกที่ ไม่ใช่ด้วยเหตุผลทางเทคนิค แต่เนื่องจากคุณยังไม่ชัดเจนว่า MySQL ทำงานอย่างไรDATETIMEเป็นตัวเลือกที่ง่ายกว่า นี่จะหมายความว่าคุณจะต้องคำนวณการประทับเวลาปัจจุบันใน PHP ก่อนจัดเก็บนั่นเป็นเรื่องง่ายเหมือน:

$mysqldate = date("Y-m-d H:i:s"); 

ฟังก์ชั่นวันที่ของ PHP ทำงานเช่น:

string date ( string $format [, int $timestamp = time() ] )

"Y-m-d H:i:s"รูปแบบเป็นหนึ่งที่เข้ากันได้กับ MySQL และโดยออกพารามิเตอร์ตัวที่สองที่ว่างเปล่าdate()เรียกร้องtime()ที่จะได้รับในปัจจุบันเวลาในยูนิกซ์

การใช้ a TIMESTAMPแทนที่จะเป็น a DATETIMEจะเป็นการเพิ่มมูลค่าให้กับ MySQL ที่รับผิดชอบในการตัดสินใจเกี่ยวกับการประทับเวลาปัจจุบันและคุณสามารถข้ามเขตข้อมูลเมื่อคุณกำลังแทรก / อัปเดต แต่เนื่องจากคุณกำลังส่งแบบสอบถามและรหัสเพื่อรับการประทับเวลาปัจจุบันใน PHP มีเพียงเล็กน้อยคุณจึงสามารถไปได้DATETIMEทุกอย่างอย่างปลอดภัย

สำหรับโค้ดจริงที่จะเก็บการประทับเวลาของ PHP ลงในฐานข้อมูลคุณควรดูที่PHP Data Objectsและหากคุณยังไม่ชัดเจนให้ถามในStackOverflowแทน แต่มีคำถามที่เกี่ยวข้องเกือบ 1.5kอยู่แล้วตรวจสอบให้แน่ใจก่อนที่จะถาม เพียงคำใบ้ที่เตรียมไว้เป็นวิธีที่เด็กเจ๋ง ๆ ทำ


อืมนั่นอาจเป็นปัญหาเกี่ยวกับวิธีที่คุณส่งแบบสอบถามไปยัง MySQL หรือในโครงสร้างตารางของคุณ ... StackOverflow เป็นสถานที่ที่ดีกว่าสำหรับปัญหาเหล่านี้โพสต์คำถามที่มีโครงสร้างตารางของคุณและรหัส php เต็มของคุณและ รายละเอียดบางอย่างเกี่ยวกับปัญหาและสิ่งที่คุณได้ลองไปแล้ว เราไม่ได้พูดคุยเกี่ยวกับการใช้งานเฉพาะที่นี่จริงๆ ...
yannis

ขอบคุณสำหรับการตอบกลับของคุณ. ฉันได้ลองใช้ $ mysqldate = date ("Ymd H: i: s"); $ query = INSERT INTO VALUE table ('". $ mysqldate."') บน php code ของฉัน แต่มันจะถูกเก็บไว้ใน MySQL เป็น 0000-00-00 00:00:00 ใน Date (field) - Datetime (datatype) ฉันต้องการเก็บวันที่และเวลาปัจจุบัน หากฉันตั้งประเภทข้อมูลเป็น Timestamp ในฐานข้อมูลจะเขียนโค้ดใน php ได้อย่างไร?
แบบแยกส่วน

ฉันไม่ได้รับอนุญาตให้โพสต์ความคิดเห็นใด ๆ ใน Stackoverflow ในขณะนี้ ฟังดูอัปยศเล็กน้อย แต่นั่นเป็นวิธีที่พวกเขาทำกับฉัน
โมดูลาร์

ฉันขอโทษสำหรับสิ่งนั้น แต่ถ้าคุณอยู่ในโหมดระงับชั่วคราวจะต้องมีเหตุผลที่ดี ตอนนี้หนึ่งข้อผิดพลาดที่เป็นไปได้ในรหัสในความคิดเห็นของคุณเกี่ยวกับคือการที่คุณจะได้รับการตั้งชื่อสนามเป็นDateที่เป็นคำสงวนสำหรับDATEประเภทข้อมูลและสิ่งที่แปลกที่อาจเกิดขึ้น (ขึ้นอยู่กับรุ่น MySQL) จึงพยายามที่จะเปลี่ยนชื่อใหม่เพื่อสิ่งที่ต้องการcreationdateและดูสิ่งที่เกิดขึ้น . นอกจากนี้จาก PHP คุณควรปฏิบัติกับTIMESTAMPเขตข้อมูลเหมือนกับDATETIMEเขตข้อมูลมันไม่สำคัญจริงๆ รูปแบบของพวกเขาเหมือนกัน
yannis

ขอบคุณหนึ่งล้าน ตอนนี้มันถูกจัดเรียงหลังจากใช้เวลาเกือบทั้งคืนเพื่อพยายามหาสาเหตุว่าทำไม :)
โมดูลาร์

2

การอ้างอิงที่นำมาจากบทความนี้:

ความแตกต่างหลัก:

TIMESTAMP ใช้เพื่อติดตามการเปลี่ยนแปลงของระเบียนและอัปเดตทุกครั้งเมื่อมีการเปลี่ยนแปลงบันทึก DATETIME ใช้เพื่อเก็บค่าเฉพาะและค่าคงที่ซึ่งไม่ได้รับผลกระทบจากการเปลี่ยนแปลงใด ๆ ในระเบียน

TIMESTAMP ยังได้รับผลกระทบจากการตั้งค่าที่เกี่ยวข้องกับ TIME ZONE DATETIME คงที่

TIMESTAMP แปลงโซนเวลาปัจจุบันภายในเป็น UTC สำหรับจัดเก็บข้อมูลและในระหว่างการดึงข้อมูลแปลงกลับเป็นโซนเวลาปัจจุบัน DATETIME ไม่สามารถทำได้

ช่วงเวลาที่รองรับ TIMESTAMP: '1970-01-01 00:00:01 to UTC ถึง' 2038-01-19 03:14:07 D UTC DATETIME รองรับช่วง: '1000-01-01 00:00:00' ถึง '9999 -12-31 23:59:59 ′


1
ดังนั้นในปี 2040 คุณจะใช้อะไรในการเปลี่ยนแปลงบันทึก Timestamp ฉันเดาว่าไม่.
Bsienn

-1

ฉันดูที่นี้ในวิธีที่ง่ายมาก ในกรณีของคุณฉันจะใช้ทั้งสองและdatetime timestampด้วยการใช้งานทั้งสองอย่างคุณจะไม่พบปัญหาใด ๆ กับการจัดเก็บข้อมูล หนึ่งเขตข้อมูลเพิ่มเติม (คอลัมน์) ในตารางของคุณก็ไม่ใช่ปัญหาใหญ่

ดังนั้นในมุมมองและประสบการณ์ของฉันฉันมักจะใช้ทั้งสองอย่าง เมื่อคุณต้องการแสดงวันที่แก่ผู้เข้าชมหรือทำให้ผู้เข้าชมเข้าใจได้จากนั้นแสดงวันที่ในรูปแบบวันที่และเวลา

รูปแบบวันที่และเวลาอาจเป็นความเจ็บปวดเมื่อคุณต้องการคำนวณบางสิ่ง (ความแตกต่างระหว่าง 2 วันรับวันวานเมื่อวานจากวันที่ปัจจุบันรับ 1 สัปดาห์ที่ผ่านมาจากวันที่ปัจจุบันรับวันพรุ่งนี้หรืออะไรทำนองนั้น) มันไม่ยากจริง ๆ จำเป็นต้องแปลงพวกเขาในtimestampแล้วทำสิ่งต่างๆ และใช่วันที่และเวลาปัจจุบันเช่นคุณได้รับจาก: $current = date("Y-m-d");หรือ$current = date("Y-m-d H:i:s");ถ้าคุณต้องการชั่วโมงนาทีและวินาทีด้วย

การประทับเวลาเป็นเพียงตัวเลข 11 หลักซึ่งไม่ได้หมายถึงอะไรเลย เมื่อคุณดูคุณจะไม่ทราบว่าเป็นวันที่ใด ดังนั้นจึงไม่เป็นมิตรกับผู้ใช้และคุณไม่สามารถใช้เพื่อสะท้อนและแสดงต่อผู้เยี่ยมชมของคุณได้ คุณจะต้อง "แปลง" มันเป็นสิ่งที่อ่านได้ แต่มันยังให้คุณสามารถแปลงได้อย่างง่ายดายและการคำนวณวันที่ที่แตกต่างกัน ตัวอย่างเช่นหากคุณต้องการได้รับการประทับเวลาสำหรับวันพรุ่งนี้ในเวลาเดียวกันคุณเพียงแค่เพิ่มจำนวนวินาทีในวันที่ปัจจุบันและคุณมีการประทับเวลาในวันพรุ่งนี้ ตัวอย่าง: $tomorrow = time()+24*3600;คุณสามารถรับความแตกต่างระหว่างสองวันในไม่กี่วินาทีหรืออะไรทำนองนั้น

ดังนั้นฉันขอแนะนำให้ใช้ทั้งวันที่และเวลาและเวลา แม้ว่าคุณจะใช้ตัวอย่าง PhpMyadmin และต้องการดูข้อมูลบางอย่างอย่างรวดเร็วมันจะง่ายขึ้นสำหรับคุณเมื่อคุณเห็นรูปแบบวันที่ในเวลาวันที่ (ตัวอย่าง2011-12-20 10:15:20:) เนื่องจากจะเป็นถ้าคุณเพิ่งดูตัวเลข 11 หลัก ดังนั้นใช้ทั้งคู่แล้วโทรและใช้อันที่เหมาะสมกับคุณมากกว่า

หากคุณต้องหรือต้องการเลือกเพียงหนึ่งฉันขอแนะนำให้ใช้การประทับเวลาเป็นอย่างอื่นใช้ทั้งสองอย่าง


1
-1 การTimestamp is just a number 11 digit long which doesn't really "mean" anythingประทับเวลา MySQL จะถูกจัดเก็บในรูปแบบเดียวกับวันที่และเวลา คุณต้องแปลงเป็น php timestamps เช่นกันเพื่อทำการคำนวณที่คุณอธิบายหรือเพียงแค่ใช้ฟังก์ชั่นวันที่ / เวลาของ MySQL และทำการคำนวณในฐานข้อมูล คำตอบของคุณไม่สมเหตุสมผล
yannis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.