sql >> Databasteknik >  >> RDS >> PostgreSQL

Finns det något sätt att ändra Rails standardtidsstämplar till Y-m-d H:i:s (istället för Y-m-d H:i:s.u) eller låta laravel ignorera decimaldelen av Y-m-d H:i:s.u?

Lösning på Rails-sidan

Det verkar som att ActiveRecord som används i Rails (5.2) automatiskt lägger till decimalsekunder ner till 1 msek för att spara created_at och updated_at eller någon annan tidsstämpelkolumn i databasen som accepterar undersekunder, enligt definitionen i filen active_record/connection_adapters/abstract/quoting.rb

Ett arbete runt är detta. Lägg till den här raden på en översta nivå i någon av filerna som alltid skulle läsas av Rails när du kommer åt en modell (t.ex. ApplicationRecord-modellfilen).

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

Du kan bekräfta det från Rails-konsolen efter att ha skapat en ny post,

MyModel.last.created_at.nsec  # => 0

eller gå helt enkelt till DB direkt för att se den.

Varning

Denna ändring påverkar inte bara created_at och updated_at men även alla andra tidsstämpelkolumner i DB. Jag tror att du fortfarande kan spara ett värde till msec (eller nsec) precision till en sådan kolumn genom att ställa in en String i motsats till en Time-instans till din Model-instans som my_model.col_msec_desired = "2018-01-02 03:04:05.678"; sedan Time::DATE_FORMATS[:db] skulle inte refereras till när posten sparades.

Potentiell lösning på Laravel-sidan

Det kan vara knepigt i skrivande stund (2018-10-18), men ett arbete verkar vara på gång, enligt en mycket nyligen Laracast-inlägg av cmbertsch01

(Obs:en stor uppdatering gjordes en dag efter från det ursprungliga inlägget, efter kommentaren.)



  1. Hur kan jag använda jQuery för att köra MySQL-frågor?

  2. hur kör jag en funktion från TOAD för Oracle och binder resultatet till ett datanät

  3. ORA-12704:teckenuppsättningen matchar inte

  4. MySQL-uppdatering första instans av en post