จะแยกปีและเดือนจากวันที่ใน PostgreSQL โดยไม่ใช้ฟังก์ชัน to_char () ได้อย่างไร


106

ฉันต้องการเลือก sql: SELECT "year-month" from table group by "year-month" AND order by dateโดยที่ปี - เดือน - รูปแบบสำหรับวันที่ "1978-01", "1923-12" เลือก to_char ของการทำงานของ couseแต่ไม่ใช่ลำดับที่ "ถูกต้อง":

to_char(timestamp_column, 'YYYY-MM')

1
ทำไมคำสั่งซื้อถึงไม่ถูกต้องกับ to_char
yairchu

1
ปิดการลงคะแนนเนื่องจากไม่ชัดเจนว่าเหตุใดจึงไม่ยอมรับ to_char ()
Alex R

คำตอบ:


68
date_part(text, timestamp)

เช่น

date_part('month', timestamp '2001-02-16 20:38:40'),
date_part('year', timestamp '2001-02-16 20:38:40') 

http://www.postgresql.org/docs/8.0/interactive/functions-datetime.html


5
วิธีการแยกเดือนและปีในครั้งเดียวคุณสามารถแสดงตัวอย่าง
mokNathal

3
date_part ('เดือน', เวลาประทับ '2001-02-16 20:38:40'), date_part ('ปี', เวลาประทับ '2001-02-16 20:38:40')
MK

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

2
คุณพยายามจะทำอะไร? แค่รับสาย? จากนั้นใช้ฟังก์ชัน to_char กับรูปแบบวันที่ที่คุณต้องการpostgresql.org/docs/8.2/static/functions-formatting.html
MK

182
to_char(timestamp, 'YYYY-MM')

คุณบอกว่าคำสั่งนั้นไม่ "ถูกต้อง" แต่ฉันไม่เห็นว่าทำไมมันถึงผิด (อย่างน้อยก็จนกว่าจะครบ 10,000 ปี)


ถ้าคุณกำลังทำงานกับ "timestamp" to_char (to_timestamp (e. "timestamp"), 'MM-YYYY')
Bruno Lee

@BrunoMarinho ถ้าคุณต้องการเรียงตามลำดับเวลาก็อย่าใช้ 'MM-YYYY ในการสั่งซื้อ' หากคุณต้องการให้แสดงผลคุณยังสามารถมีคอลัมน์ในรูปแบบนั้นได้ แต่อย่าเรียงลำดับตาม
yairchu

4
ฉันไม่เข้าใจว่าทำไมมันถึงไม่ใช่คำตอบที่ยอมรับ
Prabowo Murti

ในกรณีนี้คุณไม่สามารถออก ORDER BYเดทได้
aagjalpankaj

1
@Aviator: คุณสามารถใช้ORDER BY to_char(timestamp, 'YYYY-MM'). หรืออีกทางหนึ่งถ้าคุณทำได้SELECT to_char(timestamp, 'YYYY-MM') AS dateคุณก็สามารถใช้ORDER BY date.
yairchu

39

ใช้date_truncวิธีการตัดวัน (หรืออะไรก็ได้ที่คุณต้องการเช่นสัปดาห์ปีวัน ฯลฯ .. )

ตัวอย่างการจัดกลุ่มยอดขายจากคำสั่งซื้อตามเดือน:

select
  SUM(amount) as sales,
  date_trunc('month', created_at) as date
from orders
group by date
order by date DESC;

1
ถูกตัอง. คุณสามารถใช้เปรียบเทียบ: date (date_trunc ('month', now ())) = to_Date (5 :: varchar || '' || 2017 :: varchar, 'mm YYYY')
Alejandro Salamanca Mazuelo

เร็วกว่า "to_char (timestamp, 'YYYY-MM') ถึงสองเท่าซึ่งก็ดีเหมือนกัน
Le Droid

21

คุณสามารถตัดทอนข้อมูลทั้งหมดหลังเดือนโดยใช้date_trunc(text, timestamp):

select date_trunc('month',created_at)::date as date 
from orders 
order by date DESC;


ตัวอย่าง:

อินพุต:

created_at = '2019-12-16 18:28:13'

เอาต์พุต 1:

date_trunc('day',created_at)
// 2019-12-16 00:00:00

เอาต์พุต 2:

date_trunc('day',created_at)::date 
// 2019-12-16

เอาต์พุต 3:

date_trunc('month',created_at)::date 
// 2019-12-01

เอาต์พุต 4:

date_trunc('year',created_at)::date 
// 2019-01-01

17

ตัวเลือกที่ 1

date_trunc('month', timestamp_column)::date

จะคงรูปแบบวันที่ไว้โดยทุกเดือนเริ่มตั้งแต่วันแรก

ตัวอย่าง:

2016-08-01
2016-09-01
2016-10-01
2016-11-01
2016-12-01
2017-01-01

ตัวเลือกที่ 2

to_char(timestamp_column, 'YYYY-MM')

โซลูชันนี้เสนอโดย @yairchu ใช้งานได้ดีในกรณีของฉัน ฉันต้องการทิ้งข้อมูล 'วัน' จริงๆ



1

มันทำงานสำหรับฟังก์ชัน "มากกว่า" ไม่น้อยกว่า

ตัวอย่างเช่น:

select date_part('year',txndt)
from "table_name"
where date_part('year',txndt) > '2000' limit 10;

ทำงานได้ดี

แต่สำหรับ

select date_part('year',txndt)
from "table_name"
where date_part('year',txndt) < '2000' limit 10;

ฉันได้รับข้อผิดพลาด


มันทำงานได้มากกว่าฟังก์ชั่นไม่น้อยกว่า ตัวอย่างเช่น: เลือก date_part ('year', txndt) จาก "table_name" โดยที่ date_part ('year', txndt)> '2000' จำกัด 10; ทำงานได้ดี แต่สำหรับการเลือก date_part ('ปี', txndt) จาก "hpi_validator_q3". "cdm_inv_exceptions" โดยที่ date_part ('ปี', txndt) <'2000' ขีด จำกัด 10; ฉันได้รับข้อผิดพลาด
Anurag Bhardwaj

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