Clipper On Line • Ver Tópico - Intervalo de datas

Intervalo de datas

Discussão sobre SQL

Moderador: Moderadores

 

Intervalo de datas

Mensagempor JoséQuintas » 05 Ago 2020 09:32

Achei que tinha resolvido isso, mas não.

Usei

data between cast( '2020-01-01' as date ) and cast( '2020-01-31' as date )

será que falhou porque faltou o cast() em data?

cast( data as date ) between cast( '2020-01-01' as date ) and cast( '2020-01-31' as date )

ou não tem jeito, e tem que fazer de outra forma?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Intervalo de datas

Mensagempor Vlademiro » 05 Ago 2020 10:13

http://sqlfiddle.com/#!2/b4852/4

Stack overflow:
Use o operador BETWEEN para facilitar e converta DATETIME para DATE.

Exemplo:

SELECT titulo
FROM eventos
WHERE '2014-02-01' BETWEEN date(inicio) AND date(fim)
Veja o exemplo no sqlfiddle.

A função date() do MysQL extrai somente a parte da data para ignorar a hora na comparação.

Tentei colar o link do Stack overflow mas não deu certo. Mesmo com tag URL.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Intervalo de datas

Mensagempor JoséQuintas » 05 Ago 2020 13:40

São equivalentes, mas Date() parece mais adequada.

https://www.w3schools.com/sql/func_mysql_cast.asp
https://www.w3schools.com/sql/func_mysql_date.asp

CAST( x AS DATE )
DATE( x )

Mesmo assim, ainda deixa dúvida sobre a forma correta de usar:

data between Date( '2020-01-01' ) and Date( '2020-01-01' )

Date( data ) between '2020-01-01' and '2020-01-01'

Date( Data ) between date( '2020-01-01' ) and Date( '2020-01-01' )

Aqui ainda tentando decifrar se o problema realmente tem alguma coisa a ver com data.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Intervalo de datas

Mensagempor JoséQuintas » 05 Ago 2020 13:52

No google encontrei exemplos variados, deixando dúvida.

Em uma delas, encontrei Date_Format( Data, '%Y-%m-%d' ) BETWEEN '2020-01-01' and '2020-01-01'

Na dúvida, talvez melhor colocar em todos os elementos envolvidos, até poder confirmar aonde pode remover.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Intervalo de datas

Mensagempor JoséQuintas » 06 Ago 2020 09:20

Encontrei o erro.
É uma coisa que preciso rever no aplicativo, porque complica os comandos.
Inverti a comparaçao, e ao invés de pegar a data da nota fiscal, estava pegando a data do pedido.

Aproveitei pra alterar tudo pra DATE() ao invés de CAST().
Funciona igual das duas formas, mas é menos texto usando DATE(), e achei mais adequado usar a função que extrai data sem horário ao invés de uma função que converte qualquer coisa pra data.

de CAST( DATA AS DATE ) para DATE( DATA )

Talvez eu nem precisasse nenhuma conversão, porque os campos são DATE.
O interessante disso é que se eu alterar os campos DATE pra DATETIME, vai estar tudo pronto.

Pra quem não acompanha o Harbour, existe esse tipo nele.
É um tipo que armazena data/hora numa mesma variável/campo.
Mais prático do que usar variável/campo separado pra isso.

Por exemplo, ao invés de armazenar apenas a data de emissão, pode armazenar data e hora, só trocando o campo de DATE pra DATETIME.

E por falar nisso.... com tanto recurso do MySQL....
Dá pra oferecer pro cliente uma análise por horário, por dia da semana, etc. expandindo as análises do aplicativo.
Basta usar recursos do servidor/MySQL, ajustando o comando, sem ficar criando rotinas quilométricas pra isso.

Pois é....
E a gente pensando que a vantagem era só índices "não corrompidos", e uso remoto...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Intervalo de datas

Mensagempor JoséQuintas » 06 Ago 2020 09:55

mapa.png


Pra quem não está acostumado: não considere nada do outro mundo.
É algo até conhecido, o IIF()

conhece este?

IF .NOT. notafiscal->( dbSEEK( pedido ) )
   data = pedido->Data
ELSE
  data = notafiscal->Data
ENDIF


é equivalente a este:

data = iif( notafiscal->( dbSeek( pedido ) ), notafiscal->Data, pedido->Data )


que se for SET RELATION simplifica:

SET RELATION ...
data = iif( ! notafiscal->( eof() ), notafiscal->Data, pedido->Data )


E no caso do MySQL, é testar NULL, que significa que não encontrou nada (porque foi relacionado também)

IF( jpnotfis.notfis is null, jppedido.data, jpnotfis.data )


Ou seja, praticamente tudo do mesmo jeito.
o SQL é praticamente um "dBASE" que evoluiu, e ficou incorporado ao servidor.
E dBase... é com a gente mesmo !!!!
É voltar ao passado... ao futuro do passado.

Talvez até quem começou no tempo do dBASE tenha mais facilidade, porque o dBASE realmente era como um servidor SQL local.
Só não dava pra usar pelo aplicativo.....

Lógico, aproveitei pra mexer mais no comando.
Ao invés de agrupar por ano,mes ou format( data, '%Y-%m' ), agrupei por LAST_DAY(), que equivale ao último dia do mês da data.
Ao fazer isso, está agrupado por mês, sem complicações extras.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro