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

Sự khác biệt của Rails / Postgresql SQL w / Ngày

Phiên bản của generate_series mà bạn đang sử dụng đang hoạt động với dấu thời gian, không phải ngày. Vì vậy, '2012-10-14' của bạn và current_date đang được chuyển đổi thành timestamp with time zone s và generate_series đang tạo một bộ timestamp with time zone S; so sánh những điều này:

=> select generate_series('2012-10-14', current_date, '1 day');
    generate_series     
------------------------
 2012-10-14 00:00:00-07
 2012-10-15 00:00:00-07
 2012-10-16 00:00:00-07
 2012-10-17 00:00:00-07
 2012-10-18 00:00:00-07
 2012-10-19 00:00:00-07
 2012-10-20 00:00:00-07
(7 rows)

=> select generate_series('2012-10-14', current_date::timestamp, '1 day');
   generate_series   
---------------------
 2012-10-14 00:00:00
 2012-10-15 00:00:00
 2012-10-16 00:00:00
 2012-10-17 00:00:00
 2012-10-18 00:00:00
 2012-10-19 00:00:00
 2012-10-20 00:00:00
(7 rows)

Cái đầu tiên có múi giờ, cái thứ hai thì không.

Nhưng, current_date luôn được chuyển đổi thành dấu thời gian với điều chỉnh múi giờ của phiên cơ sở dữ liệu được áp dụng. Phiên Rails sẽ nói chuyện với cơ sở dữ liệu trong UTC, psql của bạn phiên có thể đang sử dụng ET.

Nếu bạn chỉ định ngày hiện tại theo cách thủ công và làm việc rõ ràng với timestamp s:

select generate_series('2012-10-14'::timestamp, '2012-10-20'::timestamp, '1 day')

thì bạn sẽ nhận được bảy kết quả giống nhau ở cả hai vì không có múi giờ nào trong tầm nhìn để làm cho mọi thứ trở nên lộn xộn.

Cách dễ nhất để bỏ qua múi giờ là sử dụng phiên bản số nguyên của generate_series và thực tế là việc thêm một số nguyên vào một ngày sẽ coi số nguyên là một số ngày:

select '2012-10-14'::date + generate_series(0, 6)

Điều đó sẽ cung cấp cho bạn bảy ngày tương tự mà không có sự can thiệp của múi giờ. Bạn vẫn có thể sử dụng current_date (không có múi giờ vì ngày trong SQL không có múi giờ) bằng cách lưu ý rằng sự khác biệt giữa hai ngày là số ngày giữa chúng (một số nguyên):

=> select '2012-10-14'::date + generate_series(0, current_date - '2012-10-14');
  ?column?  
------------
 2012-10-14
 2012-10-15
 2012-10-16
 2012-10-17
 2012-10-18
 2012-10-19
 2012-10-20
(7 rows)

và từ Rails:

> pp ActiveRecord::Base.connection.execute("select '2012-10-14'::date + generate_series(0, 6)").to_a
[{"?column?"=>"2012-10-14"},
 {"?column?"=>"2012-10-15"},
 {"?column?"=>"2012-10-16"},
 {"?column?"=>"2012-10-17"},
 {"?column?"=>"2012-10-18"},
 {"?column?"=>"2012-10-19"},
 {"?column?"=>"2012-10-20"}]

BTW, tôi ghét múi giờ, ghét và coi thường chúng.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Một số lĩnh vực cải tiến trong PostgreSQL 9.4

  2. Cách tạo số thứ tự trong PostgreSQL

  3. Việc giảm cơ sở dữ liệu có phải được thực hiện không trong bất kỳ giao dịch nào không?

  4. Đặc quyền siêu người dùng mặc định của postgres bị xóa vô tình - tôi có thể lấy lại không?

  5. Cách hiểu một PHÂN TÍCH GIẢI THÍCH