PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Проблем с разпределението на седмичния час в Rails и Postgresql

Вероятно бих избрал диапазон от дати колона.

Това ви дава гъвкавостта да имате парчета с различен размер и ви позволява да дефинирате ограничение за изключване за предотвратяване на припокриващи се диапазони.

Намирането на реда за дадена седмица все още е доста лесно с помощта на оператора "съдържа" @> , напр. where the_column @> to_date('2019-24', 'iyyy-iw') намира редовете, които съдържат седмица номер 24 през 2019 г.

Изразът to_date('2019-24', 'iyyy-iw') връща първия ден (понеделник) от посочената седмица.

Намирането на всички редове, които са между две седмици, също може да бъде направено, но изграждането на съответния период от време изглежда малко грозно. Можете или да създадете включващ диапазон с първия и последния ден:daterange(to_date('2019-24', 'iyyy-iw'), to_date('2019-24', 'iyyy-iw') + 6, '[]')

Или можете да създадете диапазон с изключителен горен диапазон с първия ден от следващата седмица:daterange(to_date('2019-24', 'iyyy-iw'), to_date('2019-25', 'iyyy-iw'), '[)')

Въпреки че диапазоните могат да бъдат индексирани доста ефективно и , необходимите GIST индекси са малко по-скъпи за поддържане от индекс на B-Tree на две цели колони.

Друг недостатък на използването на диапазони (ако наистина не се нуждаете от гъвкавостта) е, че те заемат повече място от две цели числа (14 байта вместо 8 или дори 4 с два smallint). Така че, ако размерът на таблицата е от значение, тогава текущото ви решение с колоните за година/седмица е по-ефективно.

Ако вашето въведено е начална и крайна дата за начало (а не „номер на седмицата“), тогава определено бих избрал daterange колона. Ако тази начална и крайна дата обхващат повече от една седмица, тогава съхранявате само един ред, а не няколко реда.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Възможно ли е динамично преминаване през колоните на таблица?

  2. Как се държи pgbouncer, когато обединяването на транзакции е активирано и се издава единичен отчет?

  3. Как мога да получа достъп до стойността по подразбиране на колона на Postgres с помощта на ActiveRecord?

  4. c++ преобразува времеви печат на postgres без часова зона в time_t

  5. Генерирайте uuid в windows postgresql