Oracle 10g: การเลือกวันที่จากคู่ด้วยรูปแบบ YYYY-MM

ฉันกำลังพยายามแสดง 12 เดือนจาก 5 ปีที่แล้วในเดือนมีนาคม วิธีเดียวที่ฉันจะทำให้ถูกต้องคือ:

select to_char(add_months(sysdate, level-51),'YYYY-MM') 
from dual 
connect by level <= 12

จอแสดงผลใด:

2014-03
2014-04
2014-05
...

อย่างไรก็ตามฉันต้องการวันที่

แต่ลองใช้:

select to_date(to_char(add_months(sysdate, level-51),'YYYY-MM'),'YYYY-MM') 
from dual 
connect by level <= 12

ให้เดือน:

2014-03-01
2014-04-01
2014-05-01
...

คำถาม ใครมีวิธีแก้ไขบ้างไหม

แก้ไข:

ทำ

alter session set nls_date_format='YYYY-MM';

แก้ไขปัญหา แต่จะกำหนดรูปแบบนี้ในขั้นตอนการจัดเก็บได้อย่างไร?


person Hey StackExchange    schedule 23.05.2018    source แหล่งที่มา
comment
คุณต้องการรับประเภทวันที่ในเอาต์พุตและแสดงในรูปแบบ 'YYYY-MM' หรือไม่ IMO คุณควรจัดรูปแบบนั้นในเลเยอร์การนำเสนอของคุณ (ส่วนหน้า แอปพลิเคชัน) เนื่องจากไม่ว่าคุณจะทำรูปแบบใดในฐานข้อมูลของคุณ ผลลัพธ์ที่คุณได้รับในแอปพลิเคชันของคุณจะเป็นวันที่และเวลา ซึ่งอาจมีรูปแบบการแสดงผลเริ่มต้นที่แตกต่างจากฐานข้อมูลของคุณ   -  person Pham X. Bach    schedule 23.05.2018
comment
มันเกี่ยวข้องกับปัญหานี้: stackoverflow.com/questions/50476162/ ตอนนี้ฉันมีวิธีแก้ปัญหานี้แล้ว แต่จะใช้ได้เฉพาะเมื่อฉันสามารถเปลี่ยน YYYY-MM-DD เป็น YYYY-MM   -  person Hey StackExchange    schedule 23.05.2018
comment
สำหรับปัญหาก่อนหน้านี้ คุณควรดำเนินการ CROSS JOIN โดยใช้ตารางปฏิทินและ EID ที่แตกต่างกันของคุณ แทนที่จะใช้ for loop และเหตุใดคุณจึงสนใจเกี่ยวกับการจัดรูปแบบประเภทวันที่และเวลาเมื่อคุณพยายามแทรกลงในตาราง หลังจากใส่แล้ว เป็นเพียงชนิด datetime และจะมีทั้งหมด part คือ ปี เดือน วัน ชั่วโมง นาที วินาที ค้นหาและอ่านเพิ่มเติมเกี่ยวกับประเภทข้อมูล Oracle DATE ดังนั้นคุณต้องการเพียง SELECT TRUNC(ADD_MONTHS(SYSDATE, LEVEL-51), 'MM') FROM dual CONNECT BY LEVEL <= 12   -  person Pham X. Bach    schedule 23.05.2018
comment
ขอบคุณ. พบวิธีแก้ปัญหาตามข้อเสนอแนะของคุณอย่างแน่นอน   -  person Hey StackExchange    schedule 23.05.2018


คำตอบ (1)


คุณสามารถตัดทอนค่าผลลัพธ์ได้:

select trunc(add_months(sysdate, level-51), 'MM')
from dual
connect by level <= 12
person Gordon Linoff    schedule 23.05.2018
comment
ขอบคุณ. คำสั่งนี้จะมีลักษณะอย่างไรหาก sysdate เป็นสตริง? สำหรับเช่น ''2014-05'' จะไม่ทำงาน มีวิธีหลีกเลี่ยงการป้อนสตริงวันที่เต็ม (พร้อมเวลา) หรือไม่? - person Hey StackExchange; 23.05.2018
comment
@เฮ้StackExchange . . ฉันไม่เข้าใจคำถาม sysdate คือวันที่ คุณควรใช้วันที่สำหรับวิธีนี้ หากคุณมีสตริง ให้แปลงเป็นวันที่ - person Gordon Linoff; 23.05.2018