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 / 287454
Accepted
Déjà vu
Déjà vu
Asked: 2021-03-22 17:34:10 +0800 CST2021-03-22 17:34:10 +0800 CST 2021-03-22 17:34:10 +0800 CST

Na mesma consulta INSERT, dois VALUES sendo NOW() podem retornar um horário diferente?

  • 772

Eu encontrei uma consulta semelhante a

INSERT INTO mytable (id, Created, Updated) VALUES (null, NOW(), NOW())

tendo definições de coluna

| Created   | datetime |
| Updated   | datetime |

Neste caso, o MySQL definirá o valor NOW() para a hora atual e retornará os mesmos valores para ambas as chamadas, ou essa consulta correrá o risco (improvável) de ter dois horários ligeiramente diferentes para Created e Updated?

Observação : não consigo alterar os tipos de campo.

mysql query
  • 4 4 respostas
  • 2893 Views

4 respostas

  • Voted
  1. Best Answer
    danblack
    2021-03-22T19:21:57+08:002021-03-22T19:21:57+08:00

    A hora retornada por NOW()e outras funções de data e hora são derivadas da hora de início da consulta. A THDclasse aqui é usada para conter todas as informações para a conexão. A implementaçãoNOW() da função pega esse valor e o retorna na estrutura.now_time

    Os documentos doNOW() MySQL também indicam:

    NOW() retorna uma hora constante que indica a hora em que a instrução começou a ser executada. ...

    Você sempre obterá o mesmo NOW()valor de qualquer lugar na consulta.

    MariaDB [test]> select now(),sleep(10),now();
    +---------------------+-----------+---------------------+
    | now()               | sleep(10) | now()               |
    +---------------------+-----------+---------------------+
    | 2021-03-22 14:17:05 |         0 | 2021-03-22 14:17:05 |
    +---------------------+-----------+---------------------+
    

    Vale a pena notar que isso não é por transação:

    MariaDB [test]> start transaction
        -> ;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [test]>  select now();
    +---------------------+
    | now()               |
    +---------------------+
    | 2021-03-22 14:20:53 |
    +---------------------+
    1 row in set (0.00 sec)
    
    MariaDB [test]> select sleep(2);
    +----------+
    | sleep(2) |
    +----------+
    |        0 |
    +----------+
    1 row in set (2.00 sec)
    
    MariaDB [test]> select now();
    +---------------------+
    | now()               |
    +---------------------+
    | 2021-03-22 14:21:00 |
    +---------------------+
    1 row in set (0.00 sec)
    
    • 25
  2. Rick James
    2021-03-22T21:10:21+08:002021-03-22T21:10:21+08:00

    Outro aspecto: SYSDATE()pode ser diferente, mas NOW()não pode.

    mysql> select now(6), sysdate(6), now(6), sysdate(6);
    +----------------------------+----------------------------+----------------------------+----------------------------+
    | now(6)                     | sysdate(6)                 | now(6)                     | sysdate(6)                 |
    +----------------------------+----------------------------+----------------------------+----------------------------+
    | 2021-03-21 22:02:28.983211 | 2021-03-21 22:02:28.983368 | 2021-03-21 22:02:28.983211 | 2021-03-21 22:02:28.983370 |
    +----------------------------+----------------------------+----------------------------+----------------------------+
    1 row in set (0.00 sec)
    

    Estou usando (6)para que possamos ver o tempo até o microssegundo. Observe como as NOWchamadas são idênticas e os menores valores. Enquanto isso, as SYSDATEligações são posteriores e não são iguais umas às outras.

    ----- 31-03-2006 5.0.20 e ainda não lançado 5.1.8 -- Funcionalidade adicionada ou alterada -- -----

    Adicionada a opção --sysdate-is-now ao mysqld para permitir que SYSDATE() seja tratado como um alias para NOW() . Consulte Funções de data e hora . (Erro #15101)

    ----- 2005-09-22 5.0.13 Release Candidate -- Bugs corrigidos -- -----

    A função SYSDATE() agora retorna a hora em que foi chamada. Em particular, dentro de uma rotina ou gatilho armazenado, SYSDATE() retorna a hora em que é executada, não a hora em que a rotina armazenada ou a instrução de gatilho começou a ser executada. (Erro #12480)

    • 17
  3. Déjà vu
    2021-03-22T18:51:28+08:002021-03-22T18:51:28+08:00

    Não achei a resposta do @nbk satisfatória o suficiente para minhas necessidades (especialmente "Não, desde que você não tenha micro segundos em seu datetime e um servidor realmente muito lento, pode ser possível").

    Então simulei uma espécie de servidor muito lento.

    Meu desktop Linux MB tem 6 núcleos, eu fiz esse programa em C

    #define COUNT 10000000000L
    
    double busy() {
         volatile double z = rand() / M_PI;
    
         for(long l=0 ; l<COUNT ; l++) {
              z += sqrt(M_PI);
         }
         return z;
    }
    

    e no principal

     int n = atoi(*++argv); // input 10 
    
     while(n--) {
          if ( ! fork()) {
                printf("%d => %lf\n", n, busy());
                exit(0);
          }
     }
    
     pid_t wpid;
     int status = 0;
     while ((wpid = wait(&status)) > 0);
    

    Isso torna n threads muito ocupados. Com n = 10, a área de trabalho estava muito ocupada...

    Enquanto isso estava sendo executado (como root , para garantir que o sistema não tente salvar alguns recursos para si mesmo :) Eu preparei isso antes

    create table a (num int auto_increment primary key,
       d1 datetime(6), d2 datetime(6), d3 datetime(6), d4 datetime(6));
    

    e um arquivo de 1000 linhas

    insert into a values(null,now(6),now(6),now(6),now(6));
    

    Então, quando o PC estava executando 10 threads busy() em 6 núcleos [todos estavam em 100%], eu injetei as 1000 inserções na tabela, demorei um pouco mais que o normal, então

    select * from a where d1 <> d2 or d1 <> d3 or d1 <> d4;
    Empty set (0.00 sec)
    

    Sim! MySQL é muito bem feito! (sério, sempre me surpreendo com a qualidade dos algoritmos e programação do sistema por trás desse SGBD).

    • 2
  4. nbk
    2021-03-22T18:14:12+08:002021-03-22T18:14:12+08:00

    Não, não haverá diferença

    como MysQL escreve no manual

    NOW() retorna uma hora constante que indica a hora em que a instrução começou a ser executada.

    Este parece ser um comportamento diferente de todas as outras funções, que são executadas coluna por coluna.

    CREATE TABLE mytable (id INT AUTO_INCREMENT PRIMARY KEY, Created DATETIME , Updated DATETIME)
    
    INSERT INTO mytable (id, Created, Updated) VALUES (null, NOW(), NOW())
    
    INSERT INTO mytable (id, Created, Updated) VALUES (null, NOW(3), NOW(3))
    
    SELECT MICROSECOND(Created),MICROSECOND(Updated) FROM mytable
    
    MICROSSEGUNDO(Criado) | MICROSSEGUNDO(Atualizado)
    -------------------: | -------------------:
                       0 | 0
                       0 | 0
    
    CREATE TABLE mytable2 (id INT AUTO_INCREMENT PRIMARY KEY, Created DATETIME(3) , Updated DATETIME(3))
    
    INSERT INTO mytable2 (id, Created, Updated) VALUES (null, NOW(3), NOW(3))
    
    SELECT MICROSECOND(Created),MICROSECOND(Updated) FROM mytable2
    
    MICROSSEGUNDO(Criado) | MICROSSEGUNDO(Atualizado)
    -------------------: | -------------------:
                  186000 | 186000
    

    db<>fique aqui

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

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