SQLite này:
date(date, '-' || strftime('%w', date) || ' days')
Là, AFAIK, trừ đi số ngày trong tuần (tức là 0 cho Chủ Nhật, 1 cho Thứ Hai, ...) từ date
và sau đó chuyển đổi kết quả trở lại date
; xem tham chiếu hàm ngày
để biết chi tiết.
Tôi nghĩ điều tương đương cho PostgreSQL sẽ là:
d - extract(dow from d)::int
ở đâu d
là ngày của bạn; trừ một số nguyên cho một ngày trừ đi số ngày đó. Nếu d
là dấu thời gian, sau đó bạn có thể cần thêm một số truyền. Có date_trunc('week', 'd')
nhưng điều đó bắt đầu đánh số các ngày từ Thứ Hai, vì vậy bạn sẽ nghỉ từng ngày một với điều đó.
Đây là phân tích nhanh về SQLite với date
biến được thay thế bằng d
để tránh nhầm lẫn với date()
chức năng:
date(d, '-' || strftime('%w', d) || ' days')
Trước hết, ||
là toán tử nối chuỗi SQL tiêu chuẩn. strftime
chức năng
là định dạng ngày và giờ cho mục đích chung đến từ POSIX
; %w
định dạng xác định có nghĩa là "ngày trong tuần là một số với Chủ nhật là ngày 0"; vì vậy strftime
cuộc gọi cung cấp cho bạn 0 cho Chủ Nhật, 1 cho Thứ Hai, v.v. lên đến 6 cho Thứ Bảy. Nếu d
là Thứ Ba, sau đó là strftime
cuộc gọi sẽ mang lại 2 và toàn bộ kết thúc là:
date(d, '-2 days')
Các công cụ sửa đổi cho SQLite date
chức năng
có nhiều dạng khác nhau nhưng '-2 days'
chỉ có nghĩa là những gì bạn nghĩ:trừ hai ngày cho d
. Kết quả chung là bạn nhận được d
được cắt ngắn thành tuần (trong đó Chủ nhật được coi là ngày đầu tiên trong tuần).
Về phía PostgreSQL:
d - extract(dow from d)::int
chúng ta có thể bắt đầu với extract
; extract
được sử dụng để trích xuất các phần cụ thể của ngày hoặc giờ và dow
có nghĩa là "ngày trong tuần dưới dạng một số với Chủ nhật là ngày số 0". Nghe có vẻ quen? Sau đó, ::int
chuyển số DOW thành một số nguyên và cần thiết vì DOW thực sự xuất hiện dưới dạng giá trị chính xác kép và không có toán tử nào được định nghĩa để trừ nhân đôi cho một ngày trong PostgreSQL; ép kiểu cũng có thể được viết ở dạng chuẩn là cast(x as int)
. Khi bạn trừ một số nguyên cho một ngày trong PostgreSQL, bạn trừ nhiều ngày đó; bạn có thể rõ ràng hơn bằng cách nói những điều như - interval '3 days'
nhưng điều đó sẽ chỉ gây thêm tiếng ồn trong trường hợp này nên tôi đã chọn đơn giản hơn. Nếu đó là Thứ Ba, thì phiên bản PostgreSQL của chúng tôi trông giống như sau:
d - 2
và điều đó giống như:
d - interval '2 days'
Và sau phép trừ, chúng tôi sẽ trở lại vào Chủ nhật. Ngoài ra còn có date_trunc
trong PostgreSQL nhưng điều đó sẽ rút ngắn đến Thứ Hai chứ không phải Chủ Nhật.