PDA

Ver la Versión Completa : extraer de una fecha el dia de la semana


tecno
06-05-2003, 16:17:12
¡Hola a tod@s!

Utilizo el BDE para acceder a tablas dBASE y programo en Builder. Para tratar fechas en consultas SQL (uso TQuery) se usa la función EXTRACT. Pero esta función solo me permite sacar el día, més y año.Lo que quiero hacer es algo como esto:

SELECT * FROM Asistencias WHERE WEEKDAY(Fecha) = 3

Esta sentecia funciona a través de ADO, pero al usar el BDE la cosa cambia. ¿Cómo podría sacar el día de la semana? ¿O eso lo tendría que calcular yo?


Gracias y Salu2. ;-)

marcoszorrilla
06-05-2003, 17:35:07
SELECT * FROM Asistencias WHERE EXTRACT(YEAR FROM fecha) = 3

Un Saludo.

tecno
06-05-2003, 18:08:55
¡Hola!

¿Seguro que extrayendo el año de la fecha te devuelve el día de la semana?
Yo no se si me estás tomando el pelo o no. De todas formas he probado lo que me dices en el Database Desktop y desde la aplicación y no funciona.

En fin...:confused:

marcoszorrilla
06-05-2003, 19:24:52
Perdón, se entiende que se debe de poner Day y no year, estoy trabajando y hago breves incursiones, sin tiempo para mucho detalle.

Un Saludo.

tecno
06-05-2003, 20:02:43
¡Hola!

Ya, ya me lo imaginé, pero con DAY lo que me saca es los registros cuya fecha es 01/xx/xxxx, es decir, todos los dias 1 de cada mes, no los días que sean 1 (Lunes) de cada semana.

El tema es saber las asistencias de los socios que hayan ido en Lunes al Bingo (bueno, en Lunes, Martes, o el día que escoja el usuario de la aplicación).

Bueno, me voy a ver el partido, mañana seguimos.

Salu2 ;)

guillotmarc
06-05-2003, 20:43:16
Hola.

Prueba a ver si te coge WEEKDAY

Saludos.

tecno
07-05-2003, 16:35:08
¡Hola Marc!

Gracias por contestar, pero ya probé también esa opción. Eso sí, el mensaje de error no es el mismo. Con WEEKDAY me dice "Capability not supported" tanto desde el Database Desktop como desde la aplicación.
De momento no he conseguido sacar el tema. Si lo logro ya pondré cómo se hace.

Salu2

andres1569
07-05-2003, 21:10:20
Hola:

Vaya por delante que este truco debe cogerse con alfileres y que seguramente no funcione en todos los casos (me refiero a diferentes SGDB por la forma de almacenar los campos Date). Lo acabo de probar en una tabla Paradox, sobre un campo definido como Date y sí funciona.

Lo de "Capability not supported" está bastante claro. El local SQL no contempla la instrucción WEEKDAY.

La sentencia SQL sería así:


SELECT *
FROM TABLAS
WHERE 7 - (("12/29/2080" - CAMPOFECHA) -
CAST ((("12/29/2080" - CAMPOFECHA) / 7) AS INTEGER) * 7) = :DiaSemana



El 29 de diciembre de 2080 es una fecha conocida que cae en domingo, creo que aprovecha hasta que nadie te pueda pedir explicaciones por un fallo en tu programa.

El parámetro :DiaSemana es de tipo Integer y es el que tendremos que asignar cada vez, teniendo en cuenta la tabla siguiente:

Lunes = 1
Martes = 2
...
Domingo = 7

De esta forma, dependiendo del día que quieras sólo tienes que asignarle el valor. Lo de dividir por 7 y convertir a integer, y luego multiplicar por 7 es una forma rudimentaria de hallar el resto (función MOD en Delphi).

Bueno, un saludo y a ver si te sirve

tecno
08-05-2003, 17:17:04
¡Hola andres1569!

Muchas gracias por tu respuesta. Lo acabo de probar tanto en el Database Desktop como desde la aplicación y funciona bien. Eso si... ¿te importaría explicar la operación? (lo que viene justo a continuación del WHERE)

Gracias y salu2 ;)

andres1569
08-05-2003, 18:40:21
Hola otra vez, trataré de explicarlo:


WHERE 7 - (("12/29/2080" - CAMPOFECHA) -
CAST ((("12/29/2080" - CAMPOFECHA) / 7) AS INTEGER) * 7)


Este galimatías lo que hace es calcular el resto, es decir si tenemos una fecha que sabemos que es domingo (29-12-2080), en Pascal sería algo así:

DiaSemana := (FechaConocidoDomingo - Fecha) mod 7

O sea, restamos la fecha de la fecha conocida como domingo y hallamos el resto de dividir por 7. Si el resto es 0 significa que estamos en domingo (han pasado X semanas exactas), si es 1 el día es sábado, si es 2 es viernes ... si es 6 es lunes. Para que el resultado siga el orden con que numeramos los días de la semana, es decir de 0 a 6, restamos de 7 (mira el principio " 7 - ").

Lo demás es una forma un tanto farragosa de hallar el resto de una división, como no hay una función MOD en SQL (al menos que conozca en SQL local), tenemos que recurrir al truco de hallarlo manualmente:

Restamos las fechas ("12/29/2080" - CAMPOFECHA),

Al resultado de esa resta le restamos los días que suman todas las semanas exactas transcurridas:

CAST ((("12/29/2080" - CAMPOFECHA) / 7) AS INTEGER) * 7

lo cual nos da el número de desfase respecto al domingo.

Al no haber función DIV como en Delphi, dividimos con el operador /, lo cual da un valor float, lo truncamos (CAST X as Integer), y luego volvemos a multiplicar por 7 (esto da un número de días múltiplo exacto de 7, o sea semanas cumplidas)

Es una pena que haya que recurrir a artilugios así para algo que podría venir fácilmente incluido, pero te puedo asegurar que he visto cosas bastante más enrevesadas, concretamente en una base Interbase, para calcular los días de un mes (hablo de Interbase 5.6), y eso que ahí se pueden utilizar StoredProcs y variables.

Saludos

__cadetill
08-05-2003, 18:48:39
La solucion es muy buena, pero solo tiene una pega....

que a partir del 29-12-2080 dejara de funcionar!!! :D

era una broma, claro, ya que el 2080 ni estaremos (creo) y el programa lo habran cambiado ya unas pocas de veces ;)

Nos leemos

tecno
08-05-2003, 19:34:59
¡Hola andres1569!

Ahora lo entiendo. La solución es muy buena. Como bién dices, es una pena que haya que recurrir a estos trucos para algo que ya está implementado en casi todos los SGDB, pero mejor este truco que nada.

Muchas gracias tanto por el truco como por la explicación. ¡Ah!, y también gracias por tu pronta respuesta. Así da gusto. :)

Salu2.

paty_rlopez
03-04-2006, 18:22:43
Hola a todos buscando en otros foros, encontré que con extract si es posible obtener el día de la semana, solo debemos poner la sentencia de esta forma:
SELECT EXTRACT (WEEKDAY FROM campo Fecha ) FROM Tabla

Espero que sea de ayuda a alguien más ya que también yo batalle por esto.

Saludos

torrelocal
12-03-2015, 19:05:56
Me sirvio. Muchas gracias!