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 / 291352
Accepted
E.Aigle
E.Aigle
Asked: 2021-05-12 00:38:20 +0800 CST2021-05-12 00:38:20 +0800 CST 2021-05-12 00:38:20 +0800 CST

Procedimento armazenado para alterar string para datetime no MySQL

  • 772

Este é um seguimento a esta pergunta . Acontece que o driver que estou usando (não posso alterá-lo) não é compatível com valores de carimbo de data/hora. Vamos dizer que está definido que eu tenho que carregar os dados no meu banco de dados MySQL 8.0 como um tipo de string. Não há nenhuma função nativa dentro do software que estou usando para ler no PLC e escrever no banco de dados que pode alterar uma string para um timestamp.

O que estou tentando descobrir agora é como configurar um gatilho que converte a string em um timestamp em insert . Essa ideia me foi sugerida pela linha direta de ajuda do software, mas se você tiver alguma ideia melhor, estou aberto a isso também. Até agora, tenho 2 colunas: uma onde "recebo" a string que é do tipo VARCHAR(30), e outra onde escrevo o valor do timestamp com o trigger.

Essa configuração parece super estúpida para mim porque acabo com 2 colunas com os mesmos dados apenas em formatos diferentes, e uma delas é completamente inútil.

Até agora, minha tabela está assim:

CREATE TABLE `test` (
  `id` mediumint NOT NULL AUTO_INCREMENT,
  `Date_VARCHAR` varchar(30) DEFAULT NULL,
  `Date_TIMESTAMP` timestamp(6) NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=52383 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

E o gatilho é:

DELIMITER $$
CREATE DEFINER = CURRENT_USER TRIGGER `db_test`.`test_BEFORE_INSERT`     
    BEFORE INSERT ON `db_test`.`test` FOR EACH ROW
    BEGIN  
    SET NEW.Date_TIMESTAMP = NEW.Date_VARCHAR ;
    END$$
DELIMITER ;

Existe uma maneira melhor de fazer isso para evitar ter os mesmos dados duas vezes? Eu gostaria de fazer um gatilho que apenas converta os dados e grave tudo em uma coluna em vez da configuração que criei.

Aqui está uma rápida olhada no que eu tenho acontecendo . Eu fiz uma inserção de alguns valores aleatórios, mas na verdade tudo está sendo feito com o plugin datalogger do KEPServerEx.

mysql trigger
  • 1 1 respostas
  • 420 Views

1 respostas

  • Voted
  1. Best Answer
    Akina
    2021-05-12T02:33:56+08:002021-05-12T02:33:56+08:00

    Com base no violino você pode aplicar

    ALTER TABLE test
    DROP COLUMN Date_TIMESTAMP,
    ADD COLUMN Date_TIMESTAMP TIMESTAMP AS (STR_TO_DATE(Date_VARCHAR, '%Y-%m-%dT%h-%i-%s'));
    

    https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=104e72ae4730b2c8c30f84f61bf392d7

    A coluna Date_TIMESTAMPpode ser definida como STORED (ocupa espaço em disco, acesso rápido) ou VIRTUAL (calculada cada vez que seu valor é recuperado, não ocupa espaço em disco).


    Alternativamente, você pode usar os gatilhos BEFORE INSERT e BEFORE UPDATE que converterão os dados inseridos em literais de data e hora corretos (mas a coluna permanecerá VARCHAR mesmo assim). Em BEFORE UPDATE você pode verificar o formato de dados atual para evitar a conversão dupla que causará um erro.

    CREATE TRIGGER trigger_name  
    BEFORE INSERT
    ON test
    FOR EACH ROW
    SET NEW.Date_VARCHAR = STR_TO_DATE(NEW.Date_VARCHAR, '%Y-%m-%dT%h-%i-%s');
    

    https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=08eb56a0b8846297c81c07e2703c0ab9

    • 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