แปลงเวลาเป็นวันที่ในแบบสอบถาม MySQL


188

ฉันต้องการแปลง a timestampใน MySQL เป็นวันที่

ผมอยากจะจัดรูปแบบข้อมูล user.registration yyyy-mm-ddลงในแฟ้มข้อความเป็น

นี่คือ SQL ของฉัน:

$sql = requestSQL("SELECT user.email, 
                   info.name, 
                   FROM_UNIXTIME(user.registration),
                   info.news
                   FROM user, info 
                   WHERE user.id = info.id ", "export members");

ฉันลองแปลงวันที่ด้วย:

DATE_FORMAT(user.registration, '%d/%m/%Y')
DATE(user.registration)

ฉันสะท้อนผลลัพธ์ก่อนที่จะเขียนไฟล์ข้อความและฉันได้รับ:

อีเมล 1; ชื่อ 1; DATE_FORMAT (ผู้ใช้การลงทะเบียน, '% d /% m /% Y'); news1

อีเมล 2; name2; news2

ฉันจะแปลงฟิลด์นั้นเป็นวันที่ได้อย่างไร


มันบันทึกไฟล์แบบนั้นเหรอ? รหัสที่คุณใช้ในการเรียกใช้แบบสอบถาม SQL คืออะไร?
seanbreeden

1
ฉันแก้ไขคำถามของฉัน requeteSQL กำลังเรียกใช้แบบสอบถาม
remyremy

คำตอบ:


373
DATE_FORMAT(FROM_UNIXTIME(`user.registration`), '%e %b %Y') AS 'date_formatted'

2
จาก MySQL 5.6.23 ฉันพบว่าควรป้อนค่า FROM_UNIXTIME () โดยตรง: เช่น DATE_FORMAT (FROM_UNIXTIME (user.registration) '% e% b% Y') ตาม 'date_formatted'
JESii

SELECT * จากผู้ใช้ซึ่ง DATE_FORMAT (FROM_UNIXTIME ( users. user_created_at), '% Y-% b-% e') = '2015-03-06' เป็นรูปแบบที่ถูกต้องหรือควรแก้ไขสิ่งนี้?
Dheeraj Thedijje

2
@DheerajThedijje สิ่งนี้แสดงเป็น 2018-Nov-6 คุณอาจกำลังมองหา'%Y-%m-%d'ตามที่คุณจัดรูปแบบใน PHP (date('Y-m-d',$row->user_created_at))- นี้ (ทั้งสองสายพันธุ์, SQL และ PHP) แสดงเป็น 2018-11-06
Chris S.

ในกรณีที่คุณต้องการเพิ่มเวลาในรูปแบบนี้ "hh: mm: ss" ให้เพิ่มลงในสตริงรูปแบบ '% H:% i:% s'
luis.ap.uyen

64

แปลงการประทับเวลาเป็นวันที่ใน MYSQL

ทำตารางด้วยการประทับเวลาจำนวนเต็ม:

mysql> create table foo(id INT, mytimestamp INT(11));
Query OK, 0 rows affected (0.02 sec)

ใส่ค่าบางอย่าง

mysql> insert into foo values(1, 1381262848);
Query OK, 1 row affected (0.01 sec)

ลองดูสิ

mysql> select * from foo;
+------+-------------+
| id   | mytimestamp |
+------+-------------+
|    1 |  1381262848 |
+------+-------------+
1 row in set (0.00 sec)

แปลงหมายเลขเป็นเวลาประทับ:

mysql> select id, from_unixtime(mytimestamp) from foo;
+------+----------------------------+
| id   | from_unixtime(mytimestamp) |
+------+----------------------------+
|    1 | 2013-10-08 16:07:28        |
+------+----------------------------+
1 row in set (0.00 sec)

แปลงเป็นรูปแบบที่อ่านได้:

mysql> select id, from_unixtime(mytimestamp, '%Y %D %M %H:%i:%s') from foo;
+------+-------------------------------------------------+
| id   | from_unixtime(mytimestamp, '%Y %D %M %H:%i:%s') |
+------+-------------------------------------------------+
|    1 | 2013 8th October 04:07:28                       |
+------+-------------------------------------------------+
1 row in set (0.00 sec)

โปรดแก้ไข% h เป็น% H
Tomot

61

ที่เพิ่งได้รับวันที่คุณสามารถcastมัน

cast(user.registration as date)

และการใช้รูปแบบเฉพาะ date_format

date_format(registration, '%Y-%m-%d')

การสาธิต SQLFiddle


มันให้ผลเหมือนกัน cast (user.registration as date) จะแสดงแทนค่าของฟิลด์
remyremy

5
สิ่งนี้ใช้ได้ผล - cast (from_unixtime (user.registration) AS date)
Eric Ness

ฉันมีรูปแบบวันที่ที่เฉพาะเจาะจงที่มันใช้ได้สำหรับฉันเช่นเดียวกับที่เป็นไปได้ขอบคุณ
saber tabatabaee yazdi

ใช้ "เป็น DATETIME" เพื่อรับชั่วโมงนาทีและวินาทีเช่นกัน
Enrique

ฉันคิดว่าคำตอบนี้เป็นคำตอบที่สั้นและชัดเจน ฉันชอบสิ่งนี้
Roman Matveev

18

หากregistrationฟิลด์เป็นประเภทที่แน่นอนTIMESTAMPคุณควรจะทำ:

$sql = "SELECT user.email, 
           info.name, 
           DATE(user.registration), 
           info.news
      FROM user, 
           info 
     WHERE user.id = info.id ";

และการลงทะเบียนควรแสดงเป็น yyyy-mm-dd


ฉันพยายาม แต่ฉันได้รับผลลัพธ์เดียวกัน: DATE (user.registration) แสดงแทนค่าของฟิลด์
remyremy

เป็นคนแนะนำคุณสามารถเรียกใช้แบบสอบถามได้สำเร็จโดยใช้ไคลเอนต์ mysql โดยตรงหรือไม่ ฉันไม่เคยได้ยินถึงฟังก์ชั่น requeteSQL มันทำอะไรกันแน่?
cs0lar

น่าเสียดายที่ฉันไม่สามารถใช้ไคลเอนต์ mysql ได้โดยตรงฉันไม่มีเซิร์ฟเวอร์ของตัวเอง ... ฉันได้เตรียม requeteSQL ไว้แล้วโดยทั่วไปจะเรียกใช้แบบสอบถามและทดสอบว่ามีข้อผิดพลาดในการส่งอีเมลหรือไม่
Remyremy

2
ที่จริงฉันรู้ว่าเขตข้อมูลของฉันเป็นประเภท BIGINT ไม่ใช่ TIMESTAMP เฉพาะเนื้อหาที่เป็นเวลา (1328649722) ดังนั้นจึงไม่ทำงาน ตอนนี้ทุกอย่างใช้ได้ดีกับ FROM_UNIXTIME!
remyremy

ใช้งานได้ดีฉันลองกับวันที่เพราะฉันต้องการได้เฉพาะส่วนวันที่
ericsicons



2

หากคุณได้รับแบบสอบถามในผลลัพธ์ของคุณคุณจะต้องแสดงรหัสที่สะท้อนผลลัพธ์จริง คุณสามารถโพสต์รหัสที่เรียกใช้ requeteSQL ได้หรือไม่

ตัวอย่างเช่นถ้าคุณใช้เครื่องหมายคำพูดเดี่ยวใน php คำสั่งนั้นจะพิมพ์ชื่อตัวแปรไม่ใช่ค่า

echo 'foo is $foo'; // foo is $foo

ฟังดูเหมือนปัญหาของคุณและฉันมั่นใจว่านี่เป็นสาเหตุ

นอกจากนี้ให้ลองลบสัญลักษณ์ @ เพื่อดูว่าสามารถช่วยคุณได้มากขึ้นหรือไม่

ดังนั้น

$SQL_result = @mysql_query($SQL_requete); // run the query

กลายเป็น

  $SQL_result = mysql_query($SQL_requete); // run the query

วิธีนี้จะหยุดการปราบปรามข้อผิดพลาดใด ๆ หากแบบสอบถามกำลังส่งข้อผิดพลาด



2

FROM_UNIXTIME(unix_timestamp, [format]) คือทั้งหมดที่คุณต้องการ

FROM_UNIXTIME(user.registration, '%Y-%m-%d') AS 'date_formatted'

FROM_UNIXTIMEรับค่าตัวเลขและแปลงเป็นDATEวัตถุ
หรือถ้ากำหนดสตริงรูปแบบจะส่งคืนเป็นสตริง

โซลูชันที่เก่ากว่าคือการรับวัตถุวันที่เริ่มต้นและจัดรูปแบบด้วยฟังก์ชันที่สองDATE_FORMAT... แต่ไม่จำเป็นอีกต่อไป


1

ลอง:

SELECT strftime("%Y-%d-%m", col_name, 'unixepoch') AS col_name

มันจะจัดรูปแบบการประทับเวลาในหน่วยมิลลิวินาทีเป็นสตริง yyyy-mm-dd

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