MySQL: datetime

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

MySQL: datetime

Mensagem por alxsts »

Olá!
cjp escreveu:Então, aqui está o problema. O comando indicando está retornando a versão 5.6.49-log (vide anexo)
cjp escreveu:Minha dúvida é: esta é a versão do MariaDB ou do MySQL? Porque o MariaDB aqui parecer ser o 10.4 (vide anexo).
Eu nunca sei que banco você está usando quando posta os erros. Pelo que percebi de outros tópicos, você usa MariaDB 10 e tem um provedor de internet onde é usado MySQL 5.6. Como já foi dito antes, se pretende usar MySQL 5.6 no provedor, esqueça o MariaDB. Se pretende usar MariaDB, contrate MariaDB no teu provedor. Ou contrate MySQL 8 no teu provedor e use ele também no lugar do MariaDB. Não dá pra usar funcionalidades novas do MySQL 8 ou MariaDB 10 no MySQL 5.6...

O exemplo que postei funciona no MariaDB 10, como mostrei no print. Não tenho MySQL 5.6 instalado mas creio que funcione nele também. Aí vem você e mostra um erro... não sei o que dizer. Rodou aquilo no MariaDb ou MySQL 5.6? Rode no 5.6 e informe se deu erro...
cjp escreveu:O problema é que, com a versão que estou usando agora do Harbour, eu não consigo tratar a string que o select me retorna de forma alguma. Mas, atualizando o Harbour, espero resolver isso.
Como não!!???
Se o select retorna '2021-05-28 00:41:14' use as funções de tratamento de string do Harbour! Sim, aquelas que já existiam no Clipper! Para isto não precisa atualizar o Harbour.

Código: Selecionar todos

Substr( '2021-05-28 00:41:14', 12,5 ) ====> 00:41  <=== Não é isto que você quer?
cjp escreveu:Mas, no Harbour, usando ADO, o mesmo select dá o "hora" com a string completa datetime (2021-05-28 00:41:14).
Isso também é por causa da versão do Harbour?
Não testei mas acredito que não tenha nada a ver com Harbour nem ADO. Revise teu código. Se não der certo, crie e poste um exemplo pequeno e que possa ser compilado.
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL: datetime

Mensagem por cjp »

Vou responder aos poucos para tentar organizar minhas ideias.
Como não!!???
Se o select retorna '2021-05-28 00:41:14' use as funções de tratamento de string do Harbour! Sim, aquelas que já existiam no Clipper! Para isto não precisa atualizar o Harbour.
Não consigo tratar esta string por causa do tipo de string que retorna. Se fosse uma string caractere (C), eu saberia tratar. Mas ela tá retornando T, que não sei tratar, e acho que não dá pra tratar na versão do Harbour que estou usando (ainda não instalei a nova).

Fiz um exemplo simples pra te mostrar:

Código: Selecionar todos

IF ADOconecta( nProvAcoes, 3 )
   cProc=conexao:execute("select online,time(online) as hora from numeros where id=1")
   onl=cProc:Fields("online"):Value
   tm=cProc:Fields("hora"):Value
   cProc:Close()
   conexao:close()
Endif

cls
?"Onl:"
?onl
?"Tm:"
?tm
?"Valtype(tm):"
?valtype(tm)
inkey(22)
inkey(22)
Veja o retorno no anexo.
Anexos
tela.png
Inacio de Carvalho Neto
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL: datetime

Mensagem por cjp »

Eu nunca sei que banco você está usando quando posta os erros. Pelo que percebi de outros tópicos, você usa MariaDB 10 e tem um provedor de internet onde é usado MySQL 5.6. Como já foi dito antes, se pretende usar MySQL 5.6 no provedor, esqueça o MariaDB. Se pretende usar MariaDB, contrate MariaDB no teu provedor. Ou contrate MySQL 8 no teu provedor e use ele também no lugar do MariaDB. Não dá pra usar funcionalidades novas do MySQL 8 ou MariaDB 10 no MySQL 5.6...

O exemplo que postei funciona no MariaDB 10, como mostrei no print. Não tenho MySQL 5.6 instalado mas creio que funcione nele também. Aí vem você e mostra um erro... não sei o que dizer. Rodou aquilo no MariaDb ou MySQL 5.6? Rode no 5.6 e informe se deu erro...
Nunca tinha me atentado para esta questão de versão do MySQL. Instalei o MySQL seguindo orientação de um post do PCToledo aqui no grupo, isso há uns 6 anos. Depois, por orientação do Quintas aqui do grupo, instalei o MariaDB. Mas ainda não entendo muito bem essas diferenças de versões etc.

Consultei o Kinghost agora sobre a possível mudança de versão. Eles me informaram:
Na King, o MariaDB 10 está disponivel na versão 5.7 do MySQL.
Pergunto: devo fazer esta alteração? Vai valer a pena? Vai resolver meu problema? Não vai me criar outros problemas?
Inacio de Carvalho Neto
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

MySQL: datetime

Mensagem por alxsts »

Olá!

Grato por postar um exemplo. Facilita muito!
cjp escreveu:Não consigo tratar esta string por causa do tipo de string que retorna. Se fosse uma string caractere (C), eu saberia tratar
O banco de dados está à sua disposição, seja ele qual for. Faça com que ele trabalhe a teu favor. Por que retornar um tipo de dados diferente de string, se você precisa de string? Faça o banco de dados te dar o que você quer. Quer apenas a hora? Faça um select que retorne a hora. Assim nem precisa tratar no Harbour e nem atualizar o Harbour.

Não sei como está definida esta coluna "OnLine" na tua tabela. Parece um DateTime ou TimeStamp. Confirme. Em todo caso, o exemplo abaixo vai resolver:

Código: Selecionar todos

SELECT Current_timestamp                                        --> 2021-05-29 20:07:50  RETORNA TIPO DATETIME 
SELECT Substr( Cast( Current_Timestamp As Varchar(20) ),12, 5 )  --> 20:08 RETORNA VARCHAR(5)

TROQUE Current_Timestamp PELO NOME DA TUA COLUNA
SELECT Substr( Cast( OnLine As Varchar(20) ),12,5)
cjp escreveu:Mas ainda não entendo muito bem essas diferenças de versões etc.
Neste caso, a diferença não é de versões e sim de produto. MySQL é um produto lançado em 23 de maio de 1995 e que atualmente pertence à Oracle. MariaDB é um fork do MySQL, lançado em 22 de janeiro de 2009 que pertence à MariaDB Corporation. Leia as histórias: MySQL MariaDB
cjp escreveu:Na King, o MariaDB 10 está disponivel na versão 5.7 do MySQL.
Considerando o que escrevi acima, esta resposta da Kinghost é no mínimo estranha... como pode o MariaDB estar disponível no MySQL? Confirme isto com eles

Creio que as melhores soluções para você sejam:
- contratar a versão mais atual do MySQL 8.0 no teu provedor de internet e trabalhar no teu desenvolvimento com a versão mais atual do MySQL 8.0
Ou
- contratar a versão mais atual do MariaDB 10 no teu provedor de internet e trabalhar no teu desenvolvimento com a versão mais atual do MariaDB 10

Veja o que é melhor financeiramente falando.

Fazendo esta escolha, você se livra de uma ferramenta obsoleta (MySQL 5.7) e passa a contar com os recursos mais atuais do MySQL 8 ou MariaDB 10.

Dica: o código acima pode ser simplificado assim:

Código: Selecionar todos

?"Onl:", onl
?"Tm:", tm
?"Valtype(tm):", valtype(tm)
inkey(22)
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL: datetime

Mensagem por cjp »

O banco de dados está à sua disposição, seja ele qual for. Faça com que ele trabalhe a teu favor. Por que retornar um tipo de dados diferente de string, se você precisa de string? Faça o banco de dados te dar o que você quer. Quer apenas a hora? Faça um select que retorne a hora. Assim nem precisa tratar no Harbour e nem atualizar o Harbour.

Não sei como está definida esta coluna "OnLine" na tua tabela. Parece um DateTime ou TimeStamp. Confirme. Em todo caso, o exemplo abaixo vai resolver:
Sim, o campo Online é um datetime.

Entendi a ideia do teu exemplo, e isto realmente resolveria o problema.

Mas acho que pode ter algum erro nele (ou eu fiz algo errado).

Testei assim:

Código: Selecionar todos

SELECT online, Substr( Cast( OnLine As Varchar(20) ),12,5) as hora from numeros where id=1
Mas deu erro no Varchar (vide anexo).
Dica: o código acima pode ser simplificado assim:
De fato, assim é mais simples, não sabia que dava assim.

Considerando o que escrevi acima, esta resposta da Kinghost é no mínimo estranha... como pode o MariaDB estar disponível no MySQL? Confirme isto com eles

Creio que as melhores soluções para você sejam:
- contratar a versão mais atual do MySQL 8.0 no teu provedor de internet e trabalhar no teu desenvolvimento com a versão mais atual do MySQL 8.0
Ou
- contratar a versão mais atual do MariaDB 10 no teu provedor de internet e trabalhar no teu desenvolvimento com a versão mais atual do MariaDB 10

Veja o que é melhor financeiramente falando.

Fazendo esta escolha, você se livra de uma ferramenta obsoleta (MySQL 5.7) e passa a contar com os recursos mais atuais do MySQL 8 ou MariaDB 10.
Vou verificar no KingHost (ou quem sabe vc possa me indicar um provedor melhor; já testei vários, mas não achei nenhum tão rápido), mas acho que não há aumento de custo não.

Mas gostaria de saber se essa mudança não implicará em necessidade de grandes mudanças no meu sistema.

A propósito, verifiquei a versão do MySQL no ITM (com quem também tenho um contrato), deu 5.7.34.

Também verifiquei a versão no localhost, deu 10.4.12-MariaDB.
Inacio de Carvalho Neto
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

MySQL: datetime

Mensagem por alxsts »

Olá!
cjp escreveu:Mas deu erro no Varchar (vide anexo).
Qual erro? Qual anexo?
cjp escreveu:Mas acho que pode ter algum erro nele (ou eu fiz algo errado).
Onde executou isto? MySql 5.7 ou MariaDB? Quanto mais informação tivermos, mais fácil podemos ajudar...

No meu MariaDB 10:
Capturar.JPG
Se está satisfeito com a performance do provedor, não precisa trocar de provedor. Troque apenas a versão do banco de dados.
cjp escreveu:Mas gostaria de saber se essa mudança não implicará em necessidade de grandes mudanças no meu sistema.
Não sei... isto depende do que você tem no teu sistema. Se escreveu teu código SQL para MySQL 5.7 e alterar para MySQL 8.0, creio que não haverá problemas pois a retro compatibilidade deve existir. Se mudar para MariaDB 10, acredito que não terá problemas também.
alxsts escreveu:A propósito, verifiquei a versão do MySQL no ITM (com quem também tenho um contrato), deu 5.7.34.
Se você alterar o Kinghost para MySQL 8, altere este também (caso for continuar a usá-lo). Padronize.

Importante: se você mudar a versão do banco de dados do teu sistema é aconselhável fazer um plano de migração dos teus clientes que estão usando MySQL 5.7 para uma versão igual à que você escolher. Caso haja algum cliente com MySQL 5.7, eles deverão fazer o upgrade também, mesmo que não seja em um primeiro momento, confiando na retro compatibilidade do MySQL 8 para o 5.7 e do MariaDB para o MySQL.
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL: datetime

Mensagem por cjp »

Qual erro? Qual anexo?
Acho que esqueci de anexar o print. Segue agora.
Onde executou isto? MySql 5.7 ou MariaDB? Quanto mais informação tivermos, mais fácil podemos ajudar...
Estou executando na base de dados do Kinghost; portanto, no MySQL 5.7.
Importante: se você mudar a versão do banco de dados do teu sistema é aconselhável fazer um plano de migração dos teus clientes que estão usando MySQL 5.7 para uma versão igual à que você escolher. Caso haja algum cliente com MySQL 5.7, eles deverão fazer o upgrade também, mesmo que não seja em um primeiro momento, confiando na retro compatibilidade do MySQL 8 para o 5.7 e do MariaDB para o MySQL.
Sim, vou ter que fazer uma operação prolongada para não interromper meus serviços nos usuários.
A ideia é fazer assim: contratar um novo banco de dados já com a nova versão, e ir mudando as tabelas aos poucos para ele, com programação antecipada no meu sistema, para não ter prejuízo de funcionamento. Depois de tudo alterado para a nova base, cancelo o banco anterior.
Anexos
tela.png
Inacio de Carvalho Neto
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

MySQL: datetime

Mensagem por alxsts »

Olá!

Nâo vejo nada de errado neste código...
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL: datetime

Mensagem por cjp »

Testei o mesmo código agora no localhost com MariaDB, funcionou perfeitamente.
Então, o jeito será mesmo trocar a versão do MySQL do provedor.
Inacio de Carvalho Neto
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

MySQL: datetime

Mensagem por alxsts »

Olá!

Faça um teste no 5.7: troque SUBSTR por SUBSTRING. Talvez seja isto...
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL: datetime

Mensagem por cjp »

Deu o mesmo erro.
Inacio de Carvalho Neto
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

MySQL: datetime

Mensagem por alxsts »

Olá!

Tente assim:

Código: Selecionar todos

SELECT Substr( Cast( Current_Timestamp As char(20) ),12, 5 )
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

MySQL: datetime

Mensagem por JoséQuintas »

datetime.png
Mas, tem certeza que precisa disso?
E será que o erro é por conteúdo nulo?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

MySQL: datetime

Mensagem por JoséQuintas »

Aqui no mysql 5.6 dá erro em

CAST( current_TimeStamp() AS VARCHAR(20) )

mas funciona

CONCAT( current_TimeStamp(), '' )

SUBSTR( current_timeStamp(), 12 )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

MySQL: datetime

Mensagem por cjp »

Tente assim:
Assim funcionou perfeitamente.

Excelente, muito obrigado.
Inacio de Carvalho Neto
Responder