A solução proposta está correta. Ou mais precisamente, é uma das várias implementações corretas. Qualquer um dos seguintes funcionaria:
- Armazene o carimbo de data/hora UTC em um campo, armazene o deslocamento em outro.
- Armazenar o carimbo de data/hora local em um campo, armazene o deslocamento em outro.
- Armazenar a
date
local em um campo e armazene umtime with time zone
noutro. (emboratime with time zone
geralmente é desencorajado...) - Armazene os carimbos de data/hora UTC em um campo e o carimbo de data/hora local em outro.
O mais fácil de longe é o primeiro, que você já propôs.
Eu evitaria armazenar carimbos de data/hora em
text
campos, pois eles tendem a não ser pesquisáveis com muita eficiência. Observe também - se você estiver vindo de um segundo plano do SQL Server, poderá recuperar seu
datetimeoffset
type, que armazena a data e hora local e o deslocamento no campo e usa o equivalente UTC durante a indexação. É comum pensar que o timestamp with time zone
do Postgres e do MySQL teriam o mesmo comportamento, mas não. Eles simplesmente usam a sessão fuso horário para converter de/para UTC. SQL Server não tem nenhum conceito de fuso horário de sessão e, portanto, a discrepância. Certifique-se de ler esta parte dos documentos do Postgres .