Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-05-2003
tecno tecno is offline
Registrado
 
Registrado: may 2003
Ubicación: MADRID
Posts: 6
Poder: 0
tecno Va por buen camino
extraer de una fecha el dia de la semana

¡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. ;-)
Responder Con Cita
  #2  
Antiguo 06-05-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
SELECT * FROM Asistencias WHERE EXTRACT(YEAR FROM fecha) = 3

Un Saludo.
Responder Con Cita
  #3  
Antiguo 06-05-2003
tecno tecno is offline
Registrado
 
Registrado: may 2003
Ubicación: MADRID
Posts: 6
Poder: 0
tecno Va por buen camino
¡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...
Responder Con Cita
  #4  
Antiguo 06-05-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 06-05-2003
tecno tecno is offline
Registrado
 
Registrado: may 2003
Ubicación: MADRID
Posts: 6
Poder: 0
tecno Va por buen camino
¡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
Responder Con Cita
  #6  
Antiguo 06-05-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Hola.

Prueba a ver si te coge WEEKDAY

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #7  
Antiguo 07-05-2003
tecno tecno is offline
Registrado
 
Registrado: may 2003
Ubicación: MADRID
Posts: 6
Poder: 0
tecno Va por buen camino
¡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
Responder Con Cita
  #8  
Antiguo 07-05-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 21
andres1569 Va por buen camino
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í:

Código:
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 iaSemana 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
Responder Con Cita
  #9  
Antiguo 08-05-2003
tecno tecno is offline
Registrado
 
Registrado: may 2003
Ubicación: MADRID
Posts: 6
Poder: 0
tecno Va por buen camino
¡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
Responder Con Cita
  #10  
Antiguo 08-05-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 21
andres1569 Va por buen camino
Hola otra vez, trataré de explicarlo:

Código:
 
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
Responder Con Cita
  #11  
Antiguo 08-05-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
La solucion es muy buena, pero solo tiene una pega....

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

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

Nos leemos
Responder Con Cita
  #12  
Antiguo 08-05-2003
tecno tecno is offline
Registrado
 
Registrado: may 2003
Ubicación: MADRID
Posts: 6
Poder: 0
tecno Va por buen camino
¡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.
Responder Con Cita
  #13  
Antiguo 03-04-2006
paty_rlopez paty_rlopez is offline
Miembro
 
Registrado: ene 2006
Ubicación: Torreón
Posts: 46
Poder: 0
paty_rlopez Va por buen camino
Con Extract si es posible

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:
Cita:
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
Responder Con Cita
  #14  
Antiguo 12-03-2015
torrelocal torrelocal is offline
Registrado
 
Registrado: may 2006
Posts: 3
Poder: 0
torrelocal Va por buen camino
Me sirvio. Muchas gracias!
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como extraer la el año de una fecha en un sentencia SQL? viajero2015 SQL 5 06-01-2005 22:25:21
Dia de la semana de una fecha Telemaco MS SQL Server 1 01-06-2004 18:05:16
Extraer Fecha En un Edit.- UTECYBER OOP 2 24-09-2003 02:08:01
Dia de la semana en una fecha User_Baja_2 Varios 1 21-08-2003 16:17:43
No puedo extraer la el día de una fecha Manuel Firebird e Interbase 1 20-05-2003 10:15:11


La franja horaria es GMT +2. Ahora son las 23:11:05.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi