ฉันรู้ว่ามันฟังดูโง่ แต่เมื่อฉันใช้
SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta') AS time
ส่งออกเป็น NULL ฉันใช้ MySQL Workbench ใน Ubuntu 12.04 64 บิตและใช้งานได้กับแล็ปท็อป / ระบบปฏิบัติการอื่นของฉัน (ใช้ MySQL Workbench ด้วย)
ฉันรู้ว่ามันฟังดูโง่ แต่เมื่อฉันใช้
SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta') AS time
ส่งออกเป็น NULL ฉันใช้ MySQL Workbench ใน Ubuntu 12.04 64 บิตและใช้งานได้กับแล็ปท็อป / ระบบปฏิบัติการอื่นของฉัน (ใช้ MySQL Workbench ด้วย)
คำตอบ:
สิ่งนี้จะเกิดขึ้นหากคุณไม่ได้โหลดตารางโซนเวลาลงใน mysql
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
mysql
คือชื่อของฐานข้อมูลในตัวที่เก็บข้อมูลการกำหนดค่าเฉพาะ MySQL
ฉันพบเธรดนี้หลังจากใช้เวลาพยายามหาสาเหตุหลังจากรันคำสั่งในคำตอบที่ยอมรับ (ซึ่งเหมือนกันในไซต์ dev ของ MySQL) คำสั่งไม่สามารถแปลงระหว่างเขตเวลาเช่น
SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','MET') AS time
ปรากฎว่าบน OS X มีสองไฟล์ที่ทำให้เกิดปัญหา: /usr/share/zoneinfo/Factory
และ/usr/share/zoneinfo/+VERSION
.
การแก้ไข ... ย้ายไฟล์เหล่านี้ไปยังตำแหน่งอื่นชั่วคราวเช่น/usr/share/zoneinfo/.bak/
อนุญาตให้ใช้คำสั่ง
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
เพื่อเติมเต็มข้อมูลเขตเวลาที่คาดไว้ทั้งหมด
นี่อาจเป็นหรือไม่เป็นข้อผิดพลาดใน MySQL เวอร์ชันที่ติดตั้งของฉัน:
$ mysql --version
mysql Ver 14.14 Distrib 5.6.11, for osx10.6 (x86_64) using EditLine wrapper
STRICT_MODE
นอกจากนี้ผมยังดำเนินงานใน
ไม่ว่าในกรณีใดฉันหวังว่าสิ่งนี้จะช่วยลดอาการปวดหัวสำหรับทุกคนที่ค้นหาวิธีแก้ไข
นอกเหนือจากสภาพแวดล้อมของ Windows คุณสามารถตั้งค่าโซนเวลาโดย
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
ในสภาพแวดล้อมWindows
1. download Time zone description tables from
http://dev.mysql.com/downloads/timezones.html
2. Stop MySQL server
3. Put then inside Mysql installation package
(เช่น C: \ Program Files \ MySQL \ data \ mysql) "
4. Start MySQL server
.. งานเสร็จแล้ว ..
หากยังคงคุณจะได้รับNULL
สำหรับการCONVERT_TZ
ดาวน์โหลดตารางฐานข้อมูลเหล่านี้และใส่ลงในฐานข้อมูล mysql http://www.4shared.com/folder/Toba2qu-/Mysql_timezone.html
ตอนนี้ปัญหาของคุณจะได้รับการแก้ไข .. :)
หากคุณใช้ MySql บน Windows คุณต้องโหลดข้อมูลเขตเวลาลงในสคีมา mysql นี่คือ HOWTO ที่ดี: http://www.geeksengine.com/article/populate-time-zone-data-for-mysql.html
หากคุณไม่ทำเช่นนี้ฟังก์ชัน CONVERT_TZ จะไม่รู้จักเขตเวลาป้อนข้อมูลของคุณ (เช่นตัวอย่างของคุณ: 'UTC', 'Asia / Jakarta') และจะส่งคืนค่า NULL
MAMP PRO
Terminal
cd /usr/share/zoneinfo/
sudo mv +VERSION ~/Desktop
cd /applications/MAMP/Library/bin
sudo ./mysql_tzinfo_to_sql /usr/share/zoneinfo | ./mysql -p -u root mysql
sudo mv ~/Desktop/+VERSION /usr/share/zoneinfo/
1) ใน Windows ตอนนี้ไม่มีโฟลเดอร์ข้อมูลอยู่C:\Program Files\MySQL\
ในคำตอบอื่น ๆ
2) C:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql
ในกรณีที่มองหา โดยทั่วไปโฟลเดอร์นี้จะซ่อนอยู่และคุณจะไม่เห็นC:\ProgramData\
บางครั้ง
3) เปลี่ยนแท็บการตั้งค่าในมุมมองเพื่อดูไฟล์และโฟลเดอร์ที่ซ่อนอยู่ตามที่อธิบายไว้ที่นี่https://irch.info/index.php?pg=kb.page&id=133
4) หยุดบริการ MySQL โดยค้นหา "services" ในปุ่ม Start ของ Windows
5) จากนั้นคลายซิป timezone_2017c_posix.zip แล้วคัดลอกไฟล์ในนั้น (คัดลอกไฟล์โดยตรงอย่าคัดลอกทั้งโฟลเดอร์เอง) และวาง
C:\ProgramData\MySQL\MySQLServer5.x\Data\mysql\
6) สำหรับ MySQL 5.7 timezone_2017c_posix.zip จะให้ไฟล์. sql หลังจากคลายซิปและอาจไม่สามารถแก้ปัญหาได้ ไปข้างหน้าและดาวน์โหลดไฟล์ zip สำหรับ 5.6 แม้ว่าคุณจะเรียกใช้ MySQL 5.7 และคัดลอกไฟล์เหล่านั้นไปยังไฟล์C:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql\
7) รีสตาร์ทเซิร์ฟเวอร์ MySQL หากต้องการตรวจสอบว่า CONVERT_TZ () ใช้งานได้หรือไม่ให้เรียกใช้แบบสอบถาม sql นี้
SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta');
และตรวจสอบเอาต์พุตที่ไม่ใช่ค่าว่าง
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
หากคุณได้รับข้อผิดพลาดdata too long for column 'abbreviation' at row 1
โปรดดู: https://bugs.mysql.com/bug.php?id=68861
การแก้ไขจะเรียกใช้สิ่งต่อไปนี้
สิ่งนี้จะเพิ่มบรรทัดเพื่อปิดใช้งานโหมด mysql และอนุญาตให้ mysql แทรกข้อมูลที่ถูกตัดทอนซึ่งเป็นเพราะจุดบกพร่องของ mysql ที่ mysql จะเพิ่มอักขระ null ในตอนท้าย (ตามลิงค์ด้านบน)
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
(if the above gives error "data too long for column 'abbreviation' at row 1")
mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/zut.sql
echo "SET SESSION SQL_MODE = '';" > /tmp/mysql_tzinfo_to.sql
cat /tmp/zut.sql >> /tmp/mysql_tzinfo_to.sql
mysql --defaults-file=/etc/mysql/my.cnf --user=verifiedscratch -p mysql < /tmp/mysql_tzinfo_to.sql
นี่คือขั้นตอนที่จะทำให้มันใช้งานได้หากคุณอยู่ใน windows และใช้ MySQL 5.7
mysql -u root -p password
ใช้use mysql
เพื่อเลือก MySQL DBเมื่อทำสำเร็จคุณจะสามารถใช้CONVERT_TZ
และฟังก์ชันเขตเวลาอื่น ๆ ได้
บน Mac OS Catalina เมื่อใช้ XAMPP
ไปที่โฟลเดอร์ / Applications / XAMPP / xamppfiles / bin ใน Terminal จากนั้นเรียกใช้ดังต่อไปนี้
./mysql_tzinfo_to_sql / usr / share / zoneinfo | ต้องตั้งค่า sed -e "s / เขตเวลาท้องถิ่น - ดูหน้าคู่มือ zic / local /" | ./mysql -u root mysql
สิ่งนี้ได้ผลสำหรับฉัน