วิธีการตั้งค่าฐานข้อมูล Postgresql เพื่อดูวันที่เป็น "MDY" อย่างถาวร


22

ฉันจะตั้งค่าฐานข้อมูลของฉันเพื่อดู 'วันที่' เป็น "MDY" โดยไม่ต้องทำงานได้อย่างไร:

SET datestyle = "ISO, MDY";

ทุกครั้งที่ฉันพยายามเข้าถึง ฉันใช้ Postgresql รุ่น 9.1, Ubuntu 12.04 ตำแหน่งที่ตั้งของระบบของฉันในเวลาของการติดตั้งฐานข้อมูลถูกกำหนดให้en_CA.utf8และเมื่อเร็ว ๆ en_US.utf8นี้ผมเปลี่ยนไป

show lc_CTYPE

ผลตอบแทน: -> "en_CA.UTF-8"

แต่

show LC_CoLLATE

ผลตอบแทน: -> "en_CA.UTF-8"

คำตอบ:


32

ฉันเคยมีปัญหาที่คล้ายกันมากเมื่อหลายปีก่อนแล้วค้นพบว่าฉันสามารถทำได้

ALTER DATABASE database_name SET datestyle TO "ISO, MDY";

ลองดู (ใช้งานได้ตามฐานข้อมูลสำหรับโซลูชันสำหรับฐานข้อมูลทั้งหมดของคุณให้ตั้งค่าพารามิเตอร์นี้ในตัวคุณpostgresql.conf- ขอบคุณ @a_horse_with_no_name)

โปรดทราบว่าการตั้งค่าเริ่มต้นคือไม่ได้เป็นอิสระที่เกิดเหตุ อย่างไรก็ตามหลังจากที่ชุดมันกับสิ่งที่มันต้องการคุณสามารถเปลี่ยนได้ด้วยตัวคุณเองในinitdbpostgresql.conf

ความคิดเห็นของ @ swasheck ทำให้ฉันทราบว่าด้วยการตั้งค่าของฉัน:

test=# SHOW lc_ctype;
      lc_ctype
--------------------
 Hungarian, Hungary
(1 row)


test=# SHOW lc_time;
      lc_time
--------------------
 Hungarian, Hungary
(1 row)

การตั้งค่าdatestyleมีผลต่อไปนี้:

SET datestyle TO "ISO, MDY";

SELECT current_date;
    date
------------
 2012-06-21
(1 row)

ตอนนี้ไม่ได้คาดหวัง - และมันก็เหมือนกันบนเซิร์ฟเวอร์อื่นด้วยen_US.UTF8เช่นกัน พยายาม"ISO, DMY"แนะนำฉันด้วยเช่นกันว่า"ISO"ส่วนนั้นมีส่วนสำคัญมากกว่าหรือน้อยกว่าเมื่อผลิตออกมา สำหรับค่าอินพุตมันมีผลตามที่คาดไว้ดังที่สรุปไว้ในตารางด้านล่าง:

                          input values
           '2016/01/21'   '01/21/2016'   '21/01/2016'         output
──────────────────────────────────────────────────────────────────────
ISO, YMD        OK             --             --            2016-01-21
ISO, DMY        --             OK             --            2016-01-21
ISO, MDY        --             --             OK            2016-01-21

- หมายถึงข้างต้นว่ารูปแบบการป้อนข้อมูลที่กำหนดส่งผลให้เกิดข้อผิดพลาดสำหรับการdatestyleตั้งค่าที่กำหนด

เมื่ออ่านเอกสารอย่างละเอียดแล้วจะเห็นได้ว่าdatestyleเป็นการตั้งค่าที่ขัดแย้งกันบางส่วน:

ด้วยเหตุผลทางประวัติศาสตร์ตัวแปรนี้มีสององค์ประกอบอิสระ: ข้อกำหนดรูปแบบเอาต์พุต (ISO, Postgres, SQL หรือเยอรมัน) และข้อกำหนดคุณสมบัติอินพุต / เอาต์พุตสำหรับการสั่งซื้อปี / เดือน / วัน (DMY, MDY หรือ YMD)

สำหรับฉันมันหมายความว่าเราต้องหาสิ่งที่เหมาะสมกับความต้องการของพวกเขาโดยการทดลอง แต่วิธีที่ดีที่สุดคือปล่อยไว้ที่ค่าเริ่มต้นและใช้รูปแบบอินพุตที่ไม่คลุมเครือเสมอ สองสิ่งเหล่านี้คือ'YYYY-MM-DD'และ'YYYYMMDD'. ฉันชอบคนรุ่นก่อน - แม้ใช้ IRL นี้)

หมายเหตุ: การdatestyleตั้งค่า (และการตั้งค่ารันไทม์อื่น ๆ ) จากpostgresql.confสามารถถูกแทนที่โดยการALTER DATABASE bla SET datestyle ...ตั้งค่าอย่างถาวรสำหรับฐานข้อมูลเดียวหรือโดยSET datestyle TO ...การตั้งค่าสำหรับเซสชันปัจจุบัน หลังนี้อาจมีประโยชน์เมื่อนำเข้าข้อมูลบุคคลที่สามด้วยรูปแบบวันที่ที่แตกต่างกัน


3

ขอบคุณ@a_horse_with_no_name | @dezso | @ ypercubeᵀᴹ

ฉันต้องการที่จะเขียนคำตอบที่ง่ายต่อการใช้: ขั้นตอน

วิธีที่ 1 : การตั้งค่า datestyle ต่อฐานข้อมูลเท่านั้น

  1. show datestyle;แสดงรูปแบบวันที่ปัจจุบัน"ISO, DMY " หรือ"ISO, MDY"

  2. ตอนนี้ขึ้นอยู่กับสิ่งที่คุณต้องการในชุด postgres DMYหรือMDYในแบบสอบถามด้านล่าง

    ALTER DATABASE "my_database_name" SET datestyle TO "ISO, DMY";

    หรือ

    ALTER DATABASE "my_database_name" SET datestyle TO "ISO, MDY";

  3. ขั้นตอนที่สำคัญที่สุด: หลังจากตั้งค่า datestyle เริ่มต้น postgres

    sudo service postgresql restart

    หรือ

    sudo /etc/init.d/postgresql restart

  4. ให้ทดสอบการกำหนดค่า

    หากคุณได้ตั้งค่าDMYด้านล่างแบบสอบถามควรจะทำงานให้คุณ

    คำค้นหา: select '20/12/2016'::date ผลลัพธ์: "2016-12-20"

    หรือ

    หากคุณได้ตั้งค่าMDYด้านล่างแบบสอบถามควรจะทำงานให้คุณ

    คำค้นหา: select '12/19/2016'::date ผลลัพธ์: "2016-12-19"

วิธีที่ 2 : อย่างถาวร: สิ่งที่คุณตั้งค่าในไฟล์กำหนดค่าจะถูกตั้งค่าในฐานข้อมูลทั้งหมดที่คุณจะสร้างในอนาคต

  1. ใน /etc/postgresql/9.3/main/postgresql.conf ตั้งค่า

    datestyle = 'iso, dmy' หรือ datestyle = 'iso, mdy'

  2. ขั้นตอนที่สำคัญที่สุด: หลังจากตั้งค่า datestyle เริ่มต้น postgres

    sudo service postgresql restart

    หรือ

    sudo /etc/init.d/postgresql restart

  3. ให้ทดสอบการกำหนดค่า

    หากคุณได้ตั้งค่าDMYด้านล่างแบบสอบถามควรจะทำงานให้คุณ

    คำค้นหา: select '20/12/2016'::date ผลลัพธ์: "2016-12-20"

    หรือ

    หากคุณได้ตั้งค่าMDYด้านล่างแบบสอบถามควรจะทำงานให้คุณ

    คำค้นหา: select '12/19/2016'::date ผลลัพธ์: "2016-12-19"

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