AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 199564
Accepted
John Bachir
John Bachir
Asked: 2018-03-07 22:31:32 +0800 CST2018-03-07 22:31:32 +0800 CST 2018-03-07 22:31:32 +0800 CST

Como devo representar um horário de término à meia-noite?

  • 772

Eu tenho uma tabela que representa intervalos de tempo.

   Column    |            Type             |                                Modifiers                                 
-------------+-----------------------------+--------------------------------------------------------------------------
 id          | bigint                      | not null default nextval('exploded_recurring_sessions_id_seq'::regclass)
 schedule_id | bigint                      | 
 start_time  | time without time zone      | 
 end_time    | time without time zone      | 

Vou então fazer uma consulta como esta:

select from my_table where localtime >= start_time and localtime < end_time;

A lógica de negócios aqui faz sentido no caso em que end_time é meia-noite, porque considero que um intervalo inclui start_time e não inclui end_time.

É claro que essa consulta não funciona, porque localtime nunca será < end_time quando end_time for 00:00:00.

Existem duas soluções para isso que eu posso pensar.

  1. em vez de 00:00:00, use '00:00:00'::time without time zone - interval '1 microsecond'para meia-noite. A probabilidade de isso causar um cálculo incorreto provavelmente é baixa o suficiente para nunca acontecer. E mesmo que isso aconteça algumas vezes por ano, as consequências são essencialmente inexistentes, pelo menos como meu sistema está agora. No entanto, é uma solução feia, e usar dados errados como esse pode ter outras consequências no futuro.
  2. select from my_table where localtime >= start_time and (localtime < end_time or end_time == '00:00:00'). Isso parece bastante simples, mas torna necessário fazer um ou mais índices especiais. Não é um problema se for a única solução, mas parece uma desvantagem que vale a pena evitar, se possível.

Existe alguma outra maneira de fazer isso? Algum tipo de função especial de data e hora que acomoda esse cálculo? Uma maneira melhor de representar os dados?

postgresql datetime
  • 2 2 respostas
  • 6275 Views

2 respostas

  • Voted
  1. John K. N.
    2018-03-08T02:09:42+08:002018-03-08T02:09:42+08:00

    Introdução

    Você pode querer considerar que 23:59:59.999pertence ao dia atual. 00:00:00.000é considerada a transição de um dia para o outro. Deixe-me explicar...

    Referência: Midnight (Wikepedia).


    Notação de 24 horas

    Dependendo se você estiver usando a notação de 24 horas ou a notação de 12 horas am/pm, as informações a seguir podem ser igualmente interessantes.

    Meio dia / Almoço

    O meio-dia não é um problema com a notação de 24 horas porque o passo de 11:59:59.999para 12:00:00.000e adiante 12:00:00.001não tem impacto no formato da hora.

    Meia-noite

    Olhando para as horas por volta da meia-noite, você descobrirá que 23:59:59.999ainda é o mesmo dia, enquanto 00:00:00.001pertence ao dia seguinte. Seguindo esta lógica o valor estático 00:00:00.000não deve pertencer a nenhum dia. É o ponto de transição.

    No entanto, alguns sistemas RDBMS mudarão a data ao adicionar 0.001 sa arquivos 2018-03-07 23:59:59.999.


    notação de 12 horas

    Meio dia / Almoço

    Meio-dia na notação de 12 horas não é nem am nem pm , embora os relógios tendam a adicionar um PM assim que o relógio salta de 11:59:59.999para 12:00:00.000. Na verdade, o meio-dia deve ter um único madicionado quando estático, visto que a.m.é definido como ante-meridiem que se traduz em antes do meio-dia e p.m.que pós-merdiem se traduz em depois do meio-dia .

    Meia-noite

    Isso é igualmente válido para a notação de 12 horas por volta da meia-noite. 11:59:59.999 p.mé perto da meia-noite. 12:00:00.001 a.m.é logo depois da meia-noite.12:00:00 a.m./p.m.é meia-noite e é exatamente 12 horas após o meio-dia ou antes do novo meio-dia.

    No entanto, a maioria dos sistemas decide adicionar um a.m.assim que o relógio atingir a meia-noite às 12 horas.


    Exemplos

    PostgreSQL

    Adicionando um milissegundo a um timestampvalor.

    Entrada:

    postgres=# select TIMESTAMP '2018-03-07 23:59:59.999' + interval '1 ms';
    

    Resultado:

     2018-03-08 00:00:00
    

    servidor SQL

    Adicionando um milissegundo a umdatetimevalor.

    Entrada:

    select dateadd(ms,001,cast('2018-03-07 23:59:59.999' as datetime))
    

    Resultado:

    2018-03-08 00:00:00.000
    

    Recomendações

    Como você pode ver com os exemplos, ambos os sistemas RDBMS testados determinam 00:00:00.000ser a hora (depois ou rotatória) meia-noite, mas para o dia seguinte.

    1. Se você não estiver usando datas junto com a hora, evite usar 00:00:00.000como notação para a meia-noite seguinte 23:59:59.999(ou 11:59:59.999 p.m.) do mesmo dia. Isso corresponde à sua solução número 1.

    2. Se você estiver usando datas junto com as horas, descubra qual notação seu RDBMS suporta ao adicionar um microssegundo a um 2018-03-07 11:59:59.999ou2018-03-07 11:59:59.999 p.m.


    Lista de Referência Completa

    • Como “meia-noite em…” deve ser interpretado? (Idioma e uso em inglês)
    • Quando é AM e quando é PM? (Artécnica)
    • 12h00 - 00h00 (WordReference.com)
    • Meia-noite é 12h ou 12h? (FAQ - Time) (National Physical Laboratory [Reino Unido])
    • AM e PM (Greenwichmeantime.com)
    • Meia -noite (Wikepédia)
    • 9.9. Funções e operadores de data/hora (PostgreSQL)
    • 8.5. Tipos de data/hora (PostgreSQL)
    • DATEADD (Documentos da Microsoft)
    • 5
  2. Best Answer
    2 revsuser126897
    2018-03-08T04:56:59+08:002018-03-08T04:56:59+08:00

    Resposta do wiki da comunidade :

    Existe alguma outra maneira de fazer isso? Algum tipo de função especial de data e hora que acomoda esse cálculo? Uma maneira melhor de representar os dados?

    O que há de errado com '24:00:00'::time?

    24:00:00é convertido para 00:00:00 o dia seguinte (no PostgreSQL), então 2018-03-07 24:00:00é o mesmo que 2018-03-08 00:00:00.

    • 1

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve