MySQL - obtener registros que segun campo fecha sean de 1 mes atrás

 
Vista:
sin imagen de perfil
Val: 95
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

obtener registros que segun campo fecha sean de 1 mes atrás

Publicado por yaney (31 intervenciones) el 10/04/2018 11:28:50
Hola a todos
tengo la siguiente consulta y quiero listar los registros que cumplan una condición: que hayan pasado 30 días desde 'campo fecha' a la fecha actual.
para obtener los días trascurridos uso DATEDIFF
Mi problema, hasta ahora, es en establecer la condición en el where de la query para indicar que el campo calculado resultante sea<30
Son 4 campos fecha, si en uno de estos 4 campos hay una fecha de la que hayan pasado 30 días me debe listar esos registros

esta es la consulta
1
SELECT appuntamento.num_ordine,cliente.cognome,cliente.nome,cliente.idcliente,cliente.cellulare,appuntamento.servizio,appuntamento.operatore,appuntamento.acconto,appuntamento.prezzototale,DATEDIFF(appuntamento.sed1,Now())as sed1,DATEDIFF(appuntamento.sed2,Now())as sed2,DATEDIFF(appuntamento.sed3,Now())as sed3,DATEDIFF(appuntamento.sed4,Now())as sed4,DATE_FORMAT(appuntamento.sed1, '%d-%m-%Y') AS sed1a,DATE_FORMAT(appuntamento.sed2, '%d-%m-%Y') AS sed2a,DATE_FORMAT(appuntamento.sed3, '%d-%m-%Y') AS sed3a,DATE_FORMAT(appuntamento.sed4, '%d-%m-%Y') AS sed4a,appuntamento.orased1,appuntamento.orased2,appuntamento.orased3,appuntamento.orased4,appuntamento.zonacorpo,appuntamento.tipolavoro,appuntamento.remarketing,DATE_FORMAT(appuntamento.data, '%d-%m-%Y') as data FROM cliente inner join appuntamento on appuntamento.clienteid=cliente.idcliente"

Quizas haya un modo más facil de listar registros cuya fecha sea de 30 días atrás, pero pongo el modo en que estoy tratando de hacerlo.

Agradezco de antemano cualquier sugerencia
saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

obtener registros que segun campo fecha sean de 1 mes atrás

Publicado por leonardo_josue (414 intervenciones) el 10/04/2018 19:32:42
Hola yaney:

1
2
3
Mi problema, hasta ahora, es en establecer la condición en el where de la query para indicar que el
campo calculado resultante sea<30 Son 4 campos fecha, si en uno de estos 4 campos hay una fecha de la que
hayan pasado 30 días me debe listar esos registros

En tu post no nos dices qué tipo de problema es el que tienes, ni tampoco nos pones algún ejemplo del WHERE que estás tratando de ejecutar ni nos pones algún código de error si es que lo hay, entonces resulta complicado tratar de jugar al adivino, pero veamos si esto te puede servir.

Puedo suponer que a lo que te refieres es que quieres usar los ALIAS de tus campos calculados en el WHERE y estás obteniendo un error. Si esto es así, se debe a que los campos calculados SÓLO EXISTEN UNA VEZ QUE REALIZASTE LA CONSULTA, en otras palabras NO PUEDES USARLOS EN EL WHERE... veamos este ejemplo, supongamos que tienes estos datos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql> SELECT * FROM TABLA ORDER BY ID;
+------+------------+
| id   | fecha      |
+------+------------+
|    1 | 2018-03-10 |
|    2 | 2018-04-10 |
|    3 | 2018-03-02 |
|    4 | 2018-04-05 |
+------+------------+
4 rows in set (0.07 sec)
 
mysql> SELECT id, fecha, DATEDIFF(NOW(), fecha) diferencia
    -> FROM tabla
    -> ORDER BY id;
+------+------------+------------+
| id   | fecha      | diferencia |
+------+------------+------------+
|    1 | 2018-03-10 |         31 |
|    2 | 2018-04-10 |          0 |
|    3 | 2018-03-02 |         39 |
|    4 | 2018-04-05 |          5 |
+------+------------+------------+
4 rows in set (0.00 sec)

Si quieres filtrar por el campo DIFERENCIA y encontrar aquellos que tienen más de 30 días de diferencia, entonces lo puedes hacer de dos formas:

1. REALIZAS EL CALCULO EN EL WHERE, para filtrar los datos:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT id, fecha, DATEDIFF(NOW(), fecha) diferencia
    -> FROM tabla
    -> WHERE
    ->   DATEDIFF(NOW(), fecha) >= 30
    -> ORDER BY id;
+------+------------+------------+
| id   | fecha      | diferencia |
+------+------------+------------+
|    1 | 2018-03-10 |         31 |
|    3 | 2018-03-02 |         39 |
+------+------------+------------+
2 rows in set (0.05 sec)

2. Filtras con una SUBCONSULTA (aquí si puedes usar el alias ya que la subconsulta se ejecuta primero que la consulta externa)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT *
    -> FROM
    -> ( SELECT id, fecha, DATEDIFF(NOW(), fecha) diferencia
    ->   FROM tabla ) T
    -> WHERE
    -> T.diferencia >= 30
    -> ORDER BY T.id;
+------+------------+------------+
| id   | fecha      | diferencia |
+------+------------+------------+
|    1 | 2018-03-10 |         31 |
|    3 | 2018-03-02 |         39 |
+------+------------+------------+
2 rows in set (0.11 sec)

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 95
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

obtener registros que segun campo fecha sean de 1 mes atrás

Publicado por yaney (31 intervenciones) el 11/04/2018 09:39:21
Muchas Gracias por tu aclaración
Sí, estaba usando los alias en el Where y con tu aclaración pues he resuelto, preferí hacer los cálculos en el where que usar la subconsulta, porque debo estudiar un poco más esa parte.

Finalmente mi consulta quedó así:

"SELECT appuntamento.num_ordine,cliente.cognome,cliente.nome,cliente.idcliente,cliente.cellulare,appuntamento.servizio,appuntamento.operatore,appuntamento.acconto,appuntamento.prezzototale,DATEDIFF(appuntamento.sed1,Now())as sed1,DATEDIFF(appuntamento.sed2,Now())as sed2,DATEDIFF(appuntamento.sed3,Now())as sed3,DATEDIFF(appuntamento.sed4,Now())as sed4,DATE_FORMAT(appuntamento.sed1, '%d-%m-%Y') AS sed1a,DATE_FORMAT(appuntamento.sed2, '%d-%m-%Y') AS sed2a,DATE_FORMAT(appuntamento.sed3, '%d-%m-%Y') AS sed3a,DATE_FORMAT(appuntamento.sed4, '%d-%m-%Y') AS sed4a,appuntamento.orased1,appuntamento.orased2,appuntamento.orased3,appuntamento.orased4,appuntamento.zonacorpo,appuntamento.tipolavoro,appuntamento.remarketing,DATE_FORMAT(appuntamento.data, '%d-%m-%Y') as data FROM cliente inner join appuntamento on appuntamento.clienteid=cliente.idcliente where remarketing like 'si' AND ((DATEDIFF(Now(), appuntamento.sed1) >= 30 and DATEDIFF(Now(), appuntamento.sed1) <= 40) OR (DATEDIFF(Now(), appuntamento.sed2) >= 30 and DATEDIFF(Now(), appuntamento.sed2) <= 40) OR (DATEDIFF(Now(), appuntamento.sed3) >= 30 and DATEDIFF(Now(), appuntamento.sed3) <= 40) OR (DATEDIFF(Now(), appuntamento.sed4) >= 30 and DATEDIFF(Now(), appuntamento.sed4) <= 40)) order by operatore"

Obtengo los registros cuyos días transcurridos entre las fechas del campofecha1, campofecha2, campofecha3 y campofecha4 (que son las columnas appuntamento.sedx) y la fecha actual son mayor que 30 y menor que 40.

Esta parte de la consulta:

DATEDIFF(appuntamento.sed1,Now())as sed1,DATEDIFF(appuntamento.sed2,Now())as sed2,DATEDIFF(appuntamento.sed3,Now())as sed3,DATEDIFF(appuntamento.sed4,Now())as sed4

...ya no me hace falta, la utilicé ahora para imprimir los días transcurrido y ver que me estaba haciendo bien la query mostrando los registros que cumplian la condición que quiero.

Lo que pasaba era que al estar utilizando el alias en el where para hacer el cálculo no me mostraba nada, no daba error, pero no traía ningún registro como es lógico, luego de tu explicación lo entendí.
Gracias por tu ayuda
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 95
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

obtener registros que segun campo fecha sean de 1 mes atrás

Publicado por yaney (31 intervenciones) el 12/04/2018 10:55:39
Hola Leonardo.
Como te deje en mi respuesta anterior logre que la consulta me arrojara los resultados que queria, pero ahora se me presenta otra problematica, yo quiero comparar las fechas de estos 4 campos, obtener la fecha mas reciente y solo a esa fecha aplicarle la condicion de que de esa fecha a hoy hayan transcurrido mas de 30 dias.
Mi pregunta concreta es, como comparar 4 campos fecha de una tabla para determinar la fecha mas reciente, existe alguna funcion para eso?
con Max(fecha) obtengo la fecha maxima de los registros, pero yo quisiera la fecha maxima de los 4 campos.
Pues yo debo listar los registros cuya fecha mas reciente sea mayor de 30 dias.
Gracias de antemano.
saludos
Yaney
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

obtener registros que segun campo fecha sean de 1 mes atrás

Publicado por leonardo_josue (414 intervenciones) el 12/04/2018 14:48:44
Hola yaney:

Esto es una pregunta completamente distinta a la original, te pido que por favor publiques otra entrada para dar este tema por concluido y tratar de manera independiente esto último que comentas... y si, hay una función que te permite regresar de manera sencilla el mayor valor de varias columnas. Te contesto en seguida.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 95
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

obtener registros que segun campo fecha sean de 1 mes atrás

Publicado por yaney (31 intervenciones) el 12/04/2018 14:50:14
Si, estaba justamente pensando en hacerlo, porque realmente es otra cosa. Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar