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

Apakah ada cara untuk mengubah stempel waktu default Rails ke Y-m-d H:i:s (alih-alih Y-m-d H:i:s.u) atau laravel mengabaikan bagian desimal dari Y-m-d H:i:s.u?

Solusi di sisi Rel

Tampaknya ActiveRecord yang digunakan di Rails (5.2) secara otomatis menambahkan detik desimal ke 1 msec dalam menyimpan created_at dan updated_at atau kolom Timestamp lain dalam DB yang menerima sub-detik, seperti yang didefinisikan dalam file active_record/connection_adapters/abstract/quoting.rb

Sebuah pekerjaan di sekitar adalah ini. Tambahkan baris ini di tingkat atas di salah satu file yang akan selalu dibaca oleh Rails saat mengakses model (seperti, file model ApplicationRecord).

Time::DATE_FORMATS[:db] = '%Y-%m-%d %H:%M:%S.000000000'

module ActiveRecord::ConnectionAdapters::Quoting
  alias_method :quoted_date_orig, :quoted_date if ! self.method_defined?(:quoted_date_orig)

  def quoted_date(*rest, **kwd)
    quoted = quoted_date_orig(*rest, **kwd)
    quoted.sub(/(\.\d*)\.\d{6}$/, '\1')
  end
end

Anda dapat mengonfirmasinya dari konsol Rails, setelah membuat catatan baru,

MyModel.last.created_at.nsec  # => 0

atau cukup akses DB secara langsung untuk melihatnya.

Peringatan

Perubahan ini tidak hanya memengaruhi created_at dan updated_at tetapi juga semua kolom cap waktu lainnya di DB. Saya pikir Anda masih dapat menyimpan nilai ke presisi msec (atau nsec) ke kolom seperti itu dengan menetapkan String sebagai lawan dari instance Time ke instance Model Anda seperti my_model.col_msec_desired = "2018-01-02 03:04:05.678"; lalu Time::DATE_FORMATS[:db] tidak akan dirujuk dalam menyimpan catatan.

Solusi potensial di sisi Laravel

Ini mungkin rumit pada saat penulisan (2018-10-18), tetapi pekerjaan tampaknya sedang berlangsung, menurut postingan Laracast terbaru oleh cmbertsch01

(Catatan:pembaruan besar dilakukan sehari setelahnya dari pos asli, mengikuti komentar.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memanggil fungsi PostgreSQL (prosedur tersimpan) dengan benar di dalam Spring/Hibernate/JPA?

  2. psql:FATAL:Otentikasi identitas gagal untuk postgres pengguna

  3. Mengapa PostgreSQL (9.1) tidak menggunakan indeks untuk pemilihan kesetaraan sederhana?

  4. Jika memungkinkan, bagaimana cara menyematkan PostgreSQL?

  5. Postgresql regexp_matches inside view selalu mengembalikan null ketika ditanya dari PHP