PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Różnice Rails/Postgresql SQL z datami

Wersja generate_series używasz sygnatur czasowych, a nie dat. Więc twój '2012-10-14' i current_date są konwertowane na timestamp with time zone s i generate_series produkuje zestaw timestamp with time zone s; porównaj te:

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

Pierwsza ma strefy czasowe, druga nie.

Ale current_date zawsze jest konwertowany na znacznik czasu z zastosowanym dostosowaniem strefy czasowej sesji bazy danych. Sesja Railsów będzie rozmawiać z bazą danych w UTC, twój psql sesja prawdopodobnie używa ET.

Jeśli ręcznie określisz bieżącą datę i jawnie pracujesz z timestamp s:

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

wtedy uzyskasz te same siedem wyników w obu, ponieważ nie ma strefy czasowej w zasięgu wzroku, aby narobić bałaganu.

Najłatwiejszym sposobem na zignorowanie stref czasowych jest użycie liczby całkowitej generate_series oraz fakt, że dodanie liczby całkowitej do daty traktuje tę liczbę jako liczbę dni:

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

To da ci te same siedem dni bez ingerencji w strefę czasową. Nadal możesz używać current_date (który nie ma strefy czasowej, ponieważ daty SQL nie mają stref czasowych), zauważając, że różnica między dwiema datami to liczba dni między nimi (liczba całkowita):

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

oraz z Railsów:

> 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, nienawidzę stref czasowych, nienawidzę i pogardzam nimi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. BeanCreationException:Błąd podczas tworzenia fasoli o nazwie „flywayInitializer”

  2. Mapuj pole punktu geometrii PostGIS za pomocą Hibernate na Spring Boot

  3. Dodaj interwał do znacznika czasu za pomocą fragmentów Ecto

  4. Postgresql Aktualny znacznik czasu w aktualizacji

  5. 3 sposoby na wyświetlenie listy wszystkich funkcji w PostgreSQL