sql >> Database teknologi >  >> RDS >> PostgreSQL

Er der en måde at ændre Rails standardtidsstempler til Y-m-d H:i:s (i stedet for Y-m-d H:i:s.u) eller få laravel til at ignorere decimaldelen af ​​Y-m-d H:i:s.u?

Løsning i Rails-siden

Det ser ud til, at ActiveRecord brugt i Rails (5.2) automatisk tilføjer decimalsekunder ned til 1 msek ved at gemme created_at og updated_at eller andre tidsstempelkolonner i databasen, der accepterer undersekunder, som defineret i filen active_record/connection_adapters/abstract/quoting.rb

Et arbejde rundt er dette. Tilføj denne linje på et øverste niveau i en hvilken som helst af de filer, som altid ville blive læst af Rails, når du får adgang til en model (såsom ApplicationRecord modelfil).

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æfte det fra Rails-konsollen, efter at du har oprettet en ny post,

MyModel.last.created_at.nsec  # => 0

eller bare få adgang til DB direkte for at se den.

Advarsel

Denne ændring påvirker ikke kun created_at og updated_at men også alle de andre tidsstempelkolonner i DB. Jeg tror, ​​du stadig kan gemme en værdi til msec (eller nsec) præcision til en sådan kolonne ved at indstille en streng i modsætning til en Time-forekomst til din modelforekomst som my_model.col_msec_desired = "2018-01-02 03:04:05.678"; derefter Time::DATE_FORMATS[:db] ville ikke blive refereret til ved lagring af posten.

Potentiel opløsning i Laravel-siden

Det kan være vanskeligt i skrivende stund (2018-10-18), men et arbejde ser ud til at være i gang, ifølge en meget nyligt Laracast-indlæg af cmbertsch01

(Bemærk:en større opdatering lavet dagen efter fra det originale indlæg efter kommentaren.)



  1. Filtrering af MySQL-forespørgsel i PHP

  2. Hvad er nyt i MariaDB 10.6

  3. MYSQL får rækker indsat fra i dag

  4. MySQL str_to_date problem