Consulta entre fechas de tabla con campo de texto
A todo@s
Tengo una tabla con un campo de texto con, entre otros, datos tipo "02-09-2019"
Quiero hacer una consulta entre fechas a ese campo. Y ya, para redondear, si no se introduce fecha de "inicio" en la consulta que tome una determinada (por ejemplo 01/11/2011) y si no se pone ninguna "final" que tome la actual.
1 respuesta
Lo tienes entre muy difícil e imposible, porque no veo una forma fácil de sacar la fecha fuera del contenido del campo... Y si en el campo se puede dar la circunstancia de que haya más de una fecha, aún peor...
Para hacer una consulta, a un campo fecha, como la que quieres hacer, es tan sencillo como ponerle en los criterios del campo:
Entre Nz([Escribe una fecha inicial];#01/11/2011#) Y Nz([Escribe una fecha final];Fecha())
Pero con las fechas dentro de un campo de texto eso no lo puedes hacer con resultados válidos, porque al ser la fecha un texto, no se comporta como fecha y los criterios de ordenación son diferentes.
Si tengo esta tabla, con las mismas fechas en un campo de texto y otro de fecha:
Si ordeno de menor a mayor el CampoTexto (fechas como texto):
Lo que no es un orden cronológico.
Mientras que si hago la misma ordenación a CampoFecha (fechas como fecha):
Siguiendo con ese ejemplo, si hago una consulta para buscar los registros del último trimestre de 2020, si lo hago sobre la fecha como texto:
Mientras que sobre el campo de fecha:
¿Podrías poner una par de ejemplos de datos que tienes en ese campo? Por si suena la flauta y se me ocurre alguna forma sencilla de poder extraer las fechas de los textos. Pero no prometo nada...
Muchas gracias por tu pronta respuesta. Con esta ya te debo una cerveza con tapa.
Campo Fecha1 (texto): o es del tipo "23-01-2017" o pone "sin fecha"
Campo Fecha2 (texto): o es del tipo "23-01-2017" o está en blanco
Los que no tengan un campo texto compatible con una fecha no me interesan. Solo quiero en la consulta los que sí son del tipo "23-01-2017"
Gracias
Vaaale, entonces sí es sencillo de realizar. Por el texto inicial de tu pregunta había entendido que en los campos tenías algo así "Comprado el día 26-02-2020".
Te lo explico con imágenes, que se verá más claro:
Parto de una tabla con los dos campos de texto como ésta:
Voy a crear una consulta para el campo Fecha1:
En ella creo un campo llamado Aux (que dejo visible para que se vea, pero puedes desmarcar la casilla "mostrar", que funciona igual, con esta expresión:
Aux: SiInm(EsFecha([Fecha1]);CFecha([Fecha1]);Nulo)
Es decir, analizamos si el contenido del Fecha1 es una fecha (o algo que pueda ser una fecha) con la función EsFecha, y en función de eso, lo convierte a fecha (con CFecha), o deja el campo en Nulo
En el criterio, le ponemos lo que te comentaba antes:
Entre Nz([Escribe una fecha inicial];#01/11/2011#) Y Nz([Escribe una fecha final];Fecha())
Verás que en la imagen del diseño de la consulta uso esta otra expresión:
Entre CFecha(Nz([Escribe una fecha inicial];#01/11/2011#)) Y CFecha(Nz([Escribe una fecha final];Fecha()))
Por la simple razón de que si en la primera escribes 01-01-2020 (que no es el típico formato de fecha que maneja Access) en vez de 01/01/2020, no te funcionará. Por eso en la segunda, fuerzo que el valor escrito se convierta a fecha y fin del problema.
Para hacer una consulta con Fecha2, sería lo mismo:
Hasta aquí todo perfecto. Una última cosa para dar por cerrado el tema.
En la consulta, los datos siguen apareciendo como texto de la forma "23-01-2017". Como hacer para que sean en formato fecha y como 23/01/2017
Otra cosilla y así "mato dos pájaros de un tiro":
En los criterios de una consulta uso:
Como [Introduce DNI] & "*"
de tal forma que se pueda introducir sólo la primera parte del DNI.
Pregunta: ¿cómo añadir que, en caso de no introducir ningún dato, utilice "34635896*" (importante lo del asterisco)
¿Quieres que en vez de hacer aquí la pregunta la ponga en una aparte?
Gracias
Para responder a la primera pregunta:
Forma fácil: quita el campo Fecha1 de la consulta y deja solo el campo Aux (le puedes poner cualquier otro nombre, menos Fecha1)
Otras formas, crear un campo nuevo con CFecha para que se convierta a fecha, usar la función Replace() para cambiar los "-" por "/" (aunque te seguirá quedando como texto...)
Para responder a la segunda: usa Nz() y el asterisco entre corchetes:
Como Nz([Introduce DNI];"34635896[*]") & "*"
No me funciona la consulta. Te mando un ejemplo a ver qué he hecho mal. Si no introduzco ningún dato no filtra bien.
La consulta funciona perfectamente, no te filtra porque no tienes ningún DNI con la secuencia de caracteres "3*", que es lo que le indicas en el filtro si no escribes nada.
Te recuerdo que mi propuesta de filtro es así porque pedías, explícitamente, que :
En caso de no introducir ningún dato, utilice "34635896*" (importante lo del asterisco)
Si pones en la tabla un registro con DNI 3*, verás como sí te filtra.
Cuando usas LIKE (o COMO) como criterio en una consulta, lo que pones entre corchetes, dentro de una cadena de texto, lo toma como carácter literal (caso del [*]), o como el conjunto de caracteres/dígitos si lleva un guión en medio ( [A-F], [3-7]...)
Esto de que no me explique bien ... menos mal que no escribo en inglés ... Perdón.
Y quería yo decir: El asterisco no es un signo "*" sino que complete lo que falta. En el caso de 3* (valor por defecto) debería de listar 3 ... 311317 ... 312X
Listo.
Había contestado a tu penúltimo mensaje antes de leer el último.
quedaría
Como Nz([Introduce DNI];"3*") & "*"
Muchísimas gracias por todo. La próxima, intentaré explicarme mejor desde el principio. Perdona por las molestias adicionales.
Si no quieres el * como caracter de la cadena, te sobra el que pones después del 3, porque ya tienes otro * fuera de la función:
Como Nz([Introduce DNI];"3") & "*"
Te serviría igual.
Fíjate que si escribes algo (por ejemplo 345) en la ventana que te sale, el criterio que usa es:
Como "345*", es decir, que te devolverá todo lo que empiece por 345
Si no escribes nada, entra la segunda parte de la función Nz() y el criterio queda:
Como "3*", es decir, te devuelve todo lo que empiece por 3.
Tal como has escrito tu el criterio (que no está mal, pero tampoco bien del todo), el criterio sería:
Como "3**", que también te devolverá todo lo que empiece por 3. Pero teniendo en cuenta que el * equivale a cualquier caracter o conjunto de caracteres, poner dos * seguidos es totalmente innecesario.
- Compartir respuesta