Как в SQLite3 узнать какие даты присутствуют в столбце содержащим и дату и время?

Работаю с SQLite3 из под Node.JS В таблице присутствует столбец с датой-временем в текстовом формате 'Feb 18 2021 11:06:37 GMT+0700'. Так же в базе есть столбец utime - числовой, где тоже время представлено в unix-формате. Может быть много (сотни) строк с одной датой, но разным временем. Для фронтенда, мне надо:

  1. узнать какие даты ('Feb 18 2021') присутствуют в таблице (чтобы знать сколько карточек будет)
  2. Далее, получать строки принадлежащие одной дате, для заполнения карточек. Какими путями это достигается? параллельно RTFM-лю

Чтоб не терять времени на фронтЕ, пока я привязался к Unix времени:

  1. получить список уникальных дат:
SELECT DISTINCT date(datetime(utime/1000, 'unixepoch','localtime')) AS dates
FROM events
ORDER BY utime
  1. Подучить строки для указанной даты:
SELECT *
FROM events
WHERE date(datetime(utime/1000, 'unixepoch','localtime')) = '2021-02-18'

Как бы теперь прикрутить GMT - часовой пояс юзера?


Ответы (1 шт):

Автор решения: Егор Банин

Для начала определимся что есть что. Timestamp (метка времени) -- это точка на временной оси, когда произошло или произойдёт некое событие. Дата (и дата-и-время) -- это не совсем время, это интерпретация времени. В один и тот же момент времени (timestamp) даты могут быть разные в зависимости от часового пояса, используемого календаря и других условностей.

Дальше. Вас интересуют даты в часовом поясе пользователя? Чтобы их получить вам надо использовать функции дат, указав смещение часового пояса пользователя. Допустим есть некое событие в 1613692799, здесь нет никакого часового пояса, это просто точка на оси времени. Если интерпретировать эту точку как UTC дату, то получится select date(1613692799, 'unixepoch') -- 2021-02-18. А чтобы взглянуть на эту же точку из UTC+3 (московское время, например) надо накинуть эти 3 часика select date(1613692799, 'unixepoch', '+3 hours') -- 2021-02-19. Для жителя Лондона это 18-е, а для меня 19-е. Всё очень просто.

Хранить часовой пояс пользователя в большинстве случаев не нужно. Во-первых, дата может зависеть не от часового пояса пользователя, а от других факторов (например на авиабилетах мы хотим видеть дату-время в часовом поясе аэропорта на день вылета). Во-вторых, обычно пользователь может изменить таймзону по разным причинам (летом у жителя Лондона станет UTC+1), и тогда сохранённая зона возможно потеряет смысл.

Если вам надо создать объект даты у себя в коде, то вы можете так же использовать timestamp. То, что у вас в результате sql date(...) нет строчки "GMT+0700" не должно вас останавливать, для создания даты вам нужна метка времени.

→ Ссылка