Página 2 de 3

MySQL: datetime

Enviado: 28 Mai 2021 01:50
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.

MySQL: datetime

Enviado: 29 Mai 2021 17:22
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.

MySQL: datetime

Enviado: 29 Mai 2021 17:46
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?

MySQL: datetime

Enviado: 29 Mai 2021 20:45
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)

MySQL: datetime

Enviado: 29 Mai 2021 22:37
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.

MySQL: datetime

Enviado: 30 Mai 2021 00:13
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.

MySQL: datetime

Enviado: 30 Mai 2021 00:44
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.

MySQL: datetime

Enviado: 30 Mai 2021 00:55
por alxsts
Olá!

Nâo vejo nada de errado neste código...

MySQL: datetime

Enviado: 30 Mai 2021 01:00
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.

MySQL: datetime

Enviado: 30 Mai 2021 01:20
por alxsts
Olá!

Faça um teste no 5.7: troque SUBSTR por SUBSTRING. Talvez seja isto...

MySQL: datetime

Enviado: 30 Mai 2021 23:34
por cjp
Deu o mesmo erro.

MySQL: datetime

Enviado: 31 Mai 2021 00:56
por alxsts
Olá!

Tente assim:

Código: Selecionar todos

SELECT Substr( Cast( Current_Timestamp As char(20) ),12, 5 )

MySQL: datetime

Enviado: 31 Mai 2021 04:40
por JoséQuintas
datetime.png
Mas, tem certeza que precisa disso?
E será que o erro é por conteúdo nulo?

MySQL: datetime

Enviado: 31 Mai 2021 04:48
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 )

MySQL: datetime

Enviado: 31 Mai 2021 10:06
por cjp
Tente assim:
Assim funcionou perfeitamente.

Excelente, muito obrigado.