Vấn đề:
Bạn muốn nhóm các bản ghi theo tháng trong cơ sở dữ liệu PostgreSQL.
Ví dụ:
Cơ sở dữ liệu của chúng tôi có một bảng có tên watch
với dữ liệu trong các cột id
, name
và production_timestamp
.
id | tên | production_timestamp |
---|---|---|
1 | xem | 2019-03-01 11:45:23 |
2 | đồng hồ thông minh | 2019-09-15 07:35:13 |
3 | băng thông minh | 2019-09-22 17:22:05 |
Giải pháp:
Bạn có thể sử dụng DATE_TRUNC()
chức năng nhóm các bản ghi trong bảng theo tháng.
Đây là truy vấn bạn sẽ viết:
SELECT DATE_TRUNC('month',production_timestamp) AS production_to_month, COUNT(id) AS count FROM watch GROUP BY DATE_TRUNC('month',production_timestamp);
Đây là kết quả của truy vấn:
production_to_month | số lượng |
---|---|
2019-03-01 00:00:00 | 1 |
2019-09-01 00:00:00 | 2 |
Thảo luận:
Sử dụng DATE_TRUNC()
nếu bạn muốn truy xuất ngày hoặc giờ với độ chính xác cụ thể từ cơ sở dữ liệu PostgreSQL. (Trong ví dụ của chúng tôi, chúng tôi đã sử dụng độ chính xác tháng.)
Hàm này có hai đối số. Đầu tiên, chúng tôi có thông số chỉ định phần ngày (trong ví dụ của chúng tôi là 'tháng'). Lưu ý rằng từ chỉ định là một chuỗi và cần được đặt trong dấu ngoặc kép.
Đối số thứ hai là giá trị dấu thời gian; đây có thể là một biểu thức trả về giá trị dấu thời gian hoặc tên của cột dấu thời gian. (Trong ví dụ của chúng tôi, chúng tôi sử dụng cột production_timestamp
).
Hàm DATE_TRUNC()
cắt ngắn dấu thời gian đến độ chính xác đã cho (trong trường hợp này là tháng). Trong cơ sở dữ liệu của chúng tôi, đồng hồ thông minh có ngày sản xuất 2019-09-15 07:35:13
; sau khi được cắt ngắn thành độ chính xác tháng, nó sẽ trở thành 2019-09-01 00:00:00
. Độ chính xác cấp tháng khiến ngày được hiển thị là '01' và thời gian được điền bằng các số không. (Các phần ngày bị cắt ngắn (ví dụ:ngày, tháng) của dấu thời gian được thay thế bằng các phần.)
Nhóm các bản ghi theo tháng rất phổ biến trong PostgreSQL. Trong ví dụ của chúng tôi, số lượng sản phẩm được tính tổng cho mỗi tháng. (COUNT()
hàm tổng hợp đếm số lượng sản phẩm). Nếu bạn nhóm các bản ghi bằng hàm tổng hợp, bạn phải sử dụng mệnh đề GROUP BY. Sau mệnh đề GROUP BY, bạn nên đặt các cột hoặc biểu thức được sử dụng với hàm tổng hợp trong câu lệnh SELECT. (Trong ví dụ của chúng tôi, đây là D ATE_TRUNC( 'month', production_timestamp)
.)
Tất nhiên, bạn không phải sử dụng DATE_TRUNC()
chỉ để nhóm các bản ghi. Bạn cũng có thể sử dụng nó để lấy ngày đầu tiên của tháng cho một ngày nhất định.
Đối với mỗi chiếc đồng hồ, chúng ta hãy lấy độ chính xác tên và ngày sản xuất đến tháng - không cần phân nhóm. Đây là truy vấn bạn sẽ viết:
SELECT name, DATE_TRUNC('month',production_timestamp) AS production_to_month FROM watch;
Đây là kết quả:
name | production_to_month |
---|---|
xem | 2019-03-01 00:00:00 |
đồng hồ thông minh | 2019-09-01 00:00:00 |
băng thông minh | 2019-09-01 00:00:00 |
Trong truy vấn này, hàm DATE_TRUNC()
cắt ngắn dấu thời gian thành độ chính xác tháng. Trong cơ sở dữ liệu của chúng tôi, đồng hồ thông minh có ngày sản xuất '2019-09-15 07:35:13'
; bây giờ là '2019-09-01 00:00:00'
, là ngày đầu tiên của tháng.