PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

strftime trong sqlite chuyển đổi thành postgres

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách hoạt động của hàm timezone () trong PostgreSQL

  2. Tổng tích lũy (đang chạy) với django orm và postgresql

  3. Hibernate cập nhật một thành nhiều tầng

  4. Truy vấn không đạt được chỉ mục - đây có phải là các cột thích hợp để lập chỉ mục không?

  5. Rails ActiveRecord kết nối với cơ sở dữ liệu Postgres sai