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
datelocal em um campo e armazene umtime with time zonenoutro. (emboratime with time zonegeralmente é 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 .