Vấn đề:
Bạn muốn lấy ngày trong năm từ một ngày hoặc cột dấu thời gian trong PostgreSQL.
Ví dụ:
Cơ sở dữ liệu của chúng tôi có một bảng có tên software_sale
với dữ liệu trong các cột id
, software
và sale_date
.
id | phần mềm | sale_date |
---|---|---|
1 | Siêu trò chơi X | 2019-09-15 |
2 | Trình duyệt X | ngày 10 tháng 10 năm 2019 |
3 | Tin tức DB | ngày 26 tháng 11 năm 2019 |
4 | MyPaintSoft | 2018-10-15 |
5 | Hệ điều hành mới | ngày 10 tháng 10 năm 2019 |
Hãy đếm số lượng mặt hàng phần mềm đã bán theo các ngày trong năm. Chúng tôi sẽ sử dụng thông tin này để tìm ra những ngày nào trong năm (không phụ thuộc vào năm thực tế) doanh số bán hàng cao hay thấp.
Giải pháp 1:
Chúng tôi sẽ sử dụng DATE_PART()
hàm số. Đây là truy vấn bạn sẽ viết:
SELECT DATE_PART('doy',sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Đây là kết quả của truy vấn:
day_of_year | số lượng |
---|---|
258 | 1 |
288 | 3 |
330 | 1 |
Thảo luận:
Sử dụng PostgreSQL DATE_PART()
hàm để truy xuất số ngày trong năm từ cột ngày / giờ / ngày giờ / dấu thời gian. Hàm này có hai đối số. Đối số đầu tiên là phần ngày (hoặc phần thời gian) mà bạn muốn hàm trả về. Trong ví dụ này, chúng tôi đang sử dụng ‘doy
', Trả về ngày trong năm. Bạn có thể sử dụng các phần khác, như ngày, năm, tháng, giờ, phút, tuần, v.v. Bạn có thể tìm hiểu thêm trong tài liệu PostgreSQL.
Đối số thứ hai là ngày / giờ / datetime / dấu thời gian mà bạn muốn trích xuất phần ngày / giờ. Đây có thể là một biểu thức trả về giá trị ngày / giờ / ngày giờ / dấu thời gian hoặc tên của cột ngày / giờ / ngày giờ / dấu thời gian. (Trong ví dụ của chúng tôi, đó là một cột của ngày kiểu dữ liệu.)
Hàm DATE_PART()
với ‘doy
’Định danh trả về số ngày trong năm (từ 1 đến 365/366) dưới dạng số nguyên. Trong ví dụ của chúng tôi, ngày trong năm của ngày bán hàng (từ sale_date
cột) hiện được hiển thị trong một cột mới, day_of_year
. Ngày 15 tháng 10 là ngày thứ 288 trong năm 2019 và năm 2018; vào ngày đó trong hơn hai năm, tổng cộng ba lần bán hàng đã được thực hiện (2 vào năm 2019, 1 vào năm 2018).
Chúng tôi sử dụng COUNT()
chức năng tổng hợp để đếm số lượng bán. Hàm này nhận một đối số; trong trường hợp này, đó là số ID phần mềm. Chúng tôi cũng cần GROUP BY
mệnh đề trong truy vấn này để nhóm các bản ghi theo ngày trong năm. (Trong ví dụ của chúng tôi, đối số thực tế là day_of_year
, bí danh cho DATE_PART('doy',sale_date)
.)
Đây không phải là cách duy nhất để lấy ngày trong năm. Chúng tôi cũng có thể sử dụng EXTRACT()
chức năng.
Giải pháp 2:
Đây là truy vấn bạn sẽ viết với EXTRACT()
chức năng:
SELECT EXTRACT('doy' FROM sale_date) AS day_of_year, COUNT(id) as count FROM software_sale GROUP BY day_of_year;
Hàm này tương tự như DATE_PART()
. Sự khác biệt là chúng tôi sử dụng FROM thay vì dấu phẩy giữa số nhận dạng phần ngày và đối số ngày và giờ. Kết quả là như nhau. Lưu ý:EXTRACT()
là tiêu chuẩn SQL.