Làm thế nào để trích xuất năm và tháng từ ngày trong PostgreSQL mà không sử dụng hàm to_char ()?


104

Tôi muốn chọn sql : SELECT "year-month" from table group by "year-month" AND order by date, trong đó năm-tháng - định dạng cho ngày "1978-01", "1923-12". select to_char of couse work , but not "right" order:

to_char(timestamp_column, 'YYYY-MM')

1
Tại sao thứ tự không đúng với to_char?
yairchu

1
Bỏ phiếu để đóng là không rõ ràng vì không rõ lý do tại sao to_char () không được chấp nhận.
Alex R

Câu trả lời:


67
date_part(text, timestamp)

ví dụ

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
làm thế nào để trích xuất tháng, năm cùng một lúc bạn có thể hiển thị một ví dụ?
mokNathal

3
date_part ('tháng', dấu thời gian '2001-02-16 20:38:40'), date_part ('năm', dấu thời gian '2001-02-16 20:38:40')
MK.

nhờ trả lời nhanh chóng, nhưng chúng ta không thể làm điều đó trong chức năng đơn hoặc làm chúng ta phải gọi nó là hai lần trong tháng và năm riêng
mokNathal

2
bạn đang cố làm gì vậy? Chỉ cần lấy một chuỗi? Sau đó sử dụng hàm to_char với định dạng ngày bạn cần postgresql.org/docs/8.2/static/functions-formatting.html
MK.

181
to_char(timestamp, 'YYYY-MM')

Bạn nói rằng thứ tự không "đúng", nhưng tôi không thể hiểu tại sao nó lại sai (ít nhất là cho đến năm 10000).


nếu bạn đang làm việc với "timestamp" to_char (to_timestamp (e. "timestamp"), 'MM-YYYY')
Bruno Lee

@BrunoMarinho nếu bạn muốn đặt hàng theo thứ tự thời gian, thì chỉ cần không sử dụng 'MM-YYYY để đặt hàng'. Nếu bạn muốn điều đó hiển thị bạn vẫn có thể có một cột ở định dạng đó nhưng không trật tự của nó
yairchu

4
Tôi không hiểu tại sao nó không phải là câu trả lời được chấp nhận.
Prabowo Murti

Trong trường hợp này, bạn không thể ORDER BYhẹn hò.
aagjalpankaj

1
@Aviator: Bạn có thể sử dụng ORDER BY to_char(timestamp, 'YYYY-MM'). Hoặc nếu bạn đã làm, SELECT to_char(timestamp, 'YYYY-MM') AS datebạn có thể chỉ cần sử dụng ORDER BY date.
yairchu

38

Sử dụng date_truncphương pháp để cắt bớt ngày (hoặc bất kỳ thứ gì khác mà bạn muốn, ví dụ: tuần, năm, ngày, v.v.)

Ví dụ về nhóm doanh thu từ các đơn đặt hàng theo tháng:

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

1
Đúng rồi. Bạn có thể sử dụng để so sánh: date (date_trunc ('month', now ())) = to_Date (5 :: varchar || '' || 2017 :: varchar, 'mm YYYY')
Alejandro Salamanca Mazuelo

Nhanh gấp đôi so với "to_char (timestamp, 'YYYY-MM')", điều này cũng tốt.
Le Droid

20

Bạn có thể cắt ngắn tất cả thông tin sau tháng bằng cách sử dụng date_trunc(text, timestamp):

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


Ví dụ:

Đầu vào:

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

Đầu ra 1:

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

Đầu ra 2:

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

Đầu ra 3:

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

Đầu ra 4:

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

16

Lựa chọn đầu tiên

date_trunc('month', timestamp_column)::date

Nó sẽ duy trì định dạng ngày với tất cả các tháng bắt đầu từ ngày đầu tiên.

Thí dụ:

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

Lựa chọn thứ 2

to_char(timestamp_column, 'YYYY-MM')

Giải pháp này do @yairchu đề xuất đã hoạt động tốt trong trường hợp của tôi. Tôi thực sự muốn loại bỏ thông tin 'ngày'.


11

Bạn có thể sử dụng hàm EXTRACT pgSQL

EX- date = 1981-05-31
EXTRACT(MONTH FROM date)
it will Give 05

Để biết thêm chi tiết Ngày-giờ PGSQL


1

Nó đang hoạt động cho các chức năng "lớn hơn" không phải cho ít hơn.

Ví dụ:

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

đang hoạt động tốt.

nhưng cho

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

Tôi đang nhận lỗi.


Nó đang hoạt động cho các chức năng lớn hơn không cho các chức năng nhỏ hơn. Ví dụ: select date_part ('year', txndt) FROM "table_name" trong đó date_part ('year', txndt)> '2000' giới hạn 10; đang hoạt động tốt. nhưng đối với date_part được chọn ('year', txndt) FROM "hpi_validator_q3". "cdm_inv_exceptions" nơi date_part ('year', txndt) <'2000' giới hạn 10; Tôi đang nhận lỗi.
Anurag Bhardwaj

1
Đây không phải là một câu trả lời - nếu bạn có một câu hỏi, hãy đăng một câu hỏi mới hơn là thêm câu hỏi của bạn làm câu trả lời.
Markoorn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.