Postgres에 시간대 저장

3361 단어 databasepostgres
Postgres에 사용자의 시간대를 저장하는 것은 앱에서 흥미로운 작업이 될 수 있습니다. 종종 이것은 백엔드(또는 더 나쁜 프론트엔드 JavaScript)의 모든 시간대에 대한 하드코딩된 목록을 생성하고 각 사용자에 대해 해당 목록의 항목을 데이터베이스에 저장하여 수행됩니다. 이 하드코딩된 마법 목록은 정확하게 작성하기 어렵고 유지 관리하기 어렵습니다. 시간대는 상상하는 것보다 더 자주 변경되지만 시간 자체보다는 덜 자주 변경됩니다.

Postgres에는 내부적으로 Postgres에서 사용하는 시간대 목록이 있는 pg_timezone_names라는 시스템 보기가 있습니다. 이 보기를 사용하여 사용자가 시간대를 선택할 수 있는 드롭다운 또는 기타 입력 유형을 생성할 수 있습니다. 이 목록은 기본적으로 상당히 크기 때문에 쿼리에서 일부 시간대(예: "posix/"로 시작하는 모든 시간대)를 필터링할 수 있습니다.

select name from pg_timezone_names where name not like 'posix%' and name not ilike 'system%' order by name;

이제 사용자의 선택을 저장하는 가장 좋은 방법을 찾아야 합니다. 사용자 테이블에 시간대를 저장하기 위해 열을 추가하여 이를 수행할 수 있습니다. namepg_timezone_names 값만 저장하기 때문에 열은 텍스트 유형입니다.

alter table users add column timezone text;

다음으로 우리는 사용자에 대해 가지고 있는 시간대에서 사용자의 이벤트를 쿼리하려고 합니다. 이벤트에 대한 start_time를 UTCtimestamptz 열로 저장합니다. 이 솔루션은 Postgres의 timezone 기능을 활용합니다. AT TIME ZONE zone도 작동합니다. 이 쿼리의 마지막join은 선택 사항이지만 UTC 오프셋을 알아야 하거나 시간대가 DST인 경우에 있습니다.

SELECT events.name, timezone(users.timezone, start_time)
FROM events
JOIN users ON events.user_id = users.id
JOIN pg_timezone_names ON users.timezone = pg_timezone_names.name;

이것은 Postgres의 to_timestamp 함수를 사용하여 날짜 형식을 지정하고 응용 프로그램이 날짜 형식을 지정하지 않도록 하여 한 단계 더 나아갈 수 있습니다.

이 기사는 원래 Magistrate에 게시되었습니다. 이 게시물이 마음에 들고 다른 사람들도 읽고 싶다면 그곳으로 가십시오.

좋은 웹페이지 즐겨찾기