PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Perbedaan Rails/Postgresql SQL dengan Tanggal

Versi generate_series yang Anda gunakan bekerja dengan cap waktu, bukan tanggal. Jadi '2012-10-14' dan current_date sedang dikonversi ke timestamp with time zone s dan generate_series menghasilkan satu set timestamp with time zone s; bandingkan ini:

=> 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)

Yang pertama memiliki zona waktu, yang kedua tidak.

Tapi, current_date selalu dikonversi ke stempel waktu dengan penyesuaian zona waktu sesi database yang diterapkan. Sesi Rails akan berbicara dengan database di UTC, psql . Anda sesi mungkin menggunakan ET.

Jika Anda secara manual menentukan tanggal saat ini dan secara eksplisit bekerja dengan timestamp s:

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

maka Anda akan mendapatkan tujuh hasil yang sama di keduanya karena tidak ada zona waktu yang terlihat untuk mengacaukan segalanya.

Cara termudah untuk mengabaikan zona waktu adalah dengan menggunakan versi integer generate_series dan fakta bahwa menambahkan bilangan bulat ke tanggal memperlakukan bilangan bulat sebagai jumlah hari:

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

Itu akan memberi Anda tujuh hari yang sama tanpa gangguan zona waktu. Anda masih dapat menggunakan current_date (yang tidak memiliki zona waktu karena tanggal SQL tidak memiliki zona waktu) dengan mencatat bahwa perbedaan antara dua tanggal adalah jumlah hari di antara tanggal tersebut (bilangan bulat):

=> 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)

dan dari 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, saya benci zona waktu, membenci dan membenci mereka.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ikhtisar Ekstensi Tepercaya di PostgreSQL 13

  2. Kesalahan sintaks di akhir input di PostgreSQL

  3. Mac + virtualenv + pip + postgresql =Kesalahan:pg_config yang dapat dieksekusi tidak ditemukan

  4. Bagaimana saya bisa mengimpor file .sql ke database postgres Heroku saya?

  5. Batasan postgres untuk rentang tanggal waktu yang unik