AYUDA CON SELECT DE FECHA EN SQL SERVER 2008

1,658 views
Skip to first unread message

ARVIOS

unread,
May 25, 2012, 5:12:37 PM5/25/12
to publice...@googlegroups.com
Hola Amigos, les pido el favor con la siguiente consulta:

Necesito hacer un select donde where es la comparación de una fecha

lo tengo en vfp 9 con set date to ansi y me muestra las fecha es vfp 2012.05.15

El campo en SQL es formato Date y lo guarda 2012-05-15, pero he tratado de hacer un select desde vfp 9 y me sale error

Me puede ayudar cómo tengo que hacer el select. El ejmplo que estoy haciendo es el siguiente:

wdFecha = DATE() osea me guarda 2012.05.15 tipo date

SQLEXEC(wConecion,"SELECT * FROM CORESD WHERE fecha >= "+wdFecha,"prueba")

Gracias por su ayuda

Arnoldo


Fox Reloaded

unread,
May 25, 2012, 5:20:35 PM5/25/12
to publice...@googlegroups.com
Bueno tendrias que ver bajo que formato de tu servidor de SQL estas guardando las fechas, despues de eso podrias crear una funcion personalizada en la cual cambies la variable donde tienes la fecha, por la que usa tu servidor de SQL.

Despues solo seria cambiar un poco la instruccion de SQL.

TEXT TO dateSQL TEXTMERGE NOSHOW
       SELECT * FROM CORESD WHERE  fecha >= ?wdFecha
ENDTEXT
SQLPREPARE(X,dateSQL) && DONDE X ES EL NOMBRE DE LA CONEXION
IF SQLEXEC(X,dateSQL) <= 0
     =AERROR(laWrongQuery)
     MESSAGEBOX('ERROR EN LA CONSULTA' + laWrongQuery[2])
ELSE
     WAIT WINDOW 'CONSULTA CORRECTA' NO WAIT
ENDIF

Creo que asi como tenei la consulta si bien te la deja pasar no te muestra datos porque creo que hay error en la sintaxis de la misma.

SQLEXEC(wConecion,"SELECT * FROM CORESD WHERE fecha >= "+wdFecha,"prueba")  && Error de Sintaxis

SQLEXEC(wConecion,"SELECT * FROM CORESD WHERE fecha >= "+wdFecha+","prueba")  && Consulta correcta pero sin resultados.

Espero que esto te sirva.

Saludos.

Christian Torres.
Venezuela.

2012/5/25 ARVIOS <arv...@gmail.com>



--
Thanks for everything... :D


         --- Fox ---
Maracaibo, Venezuela

extremo

unread,
May 25, 2012, 5:52:56 PM5/25/12
to Comunidad de Visual Foxpro en Español
Hola

Primero que todo tu variable wdFecha es de tipo date por lo tanto tu
sql deberia ser asi

SQLEXEC(wConecion,"SELECT * FROM CORESD WHERE fecha >=
"+dtoc(wdFecha),"prueba")

Segundo, en lo personal prefiero la siguente manera (es mas entendible
y mas directa):

SQLEXEC(wConecion,"SELECT * FROM CORESD WHERE fecha >= ?
wdFecha,"prueba")

Bendiciones
> *Thanks for everything... :D*
> *
> *
> *
> *
> *         **--- Fox ---*
> *Maracaibo, Venezuela*

ricardo peña

unread,
May 25, 2012, 5:53:45 PM5/25/12
to GRUPO-VFP GRUPO-VFP
Recuerda el formato que tiene la fecha de sql server.
 
Es muy probable que sea un campo datetime y cuando lo manejas
 
debas hacer antes
 
wdFecha=dtot(date()) para "emparejar" los formatos y luego

SQLEXEC(wConecion,"SELECT * FROM CORESD WHERE fecha >= ?wdFecha","prueba")
 
Verifica la parte "time" de la fecha del sql server

Ricardo Luis Peña
Analista de Sistemas
BA - Argentina
011-15-4440-7378
 

Date: Fri, 25 May 2012 14:12:37 -0700
From: arv...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] AYUDA CON SELECT DE FECHA EN SQL SERVER 2008

mpulla

unread,
May 25, 2012, 7:06:49 PM5/25/12
to publice...@googlegroups.com

Hola.

Se lo puede hacer de varias maneras te pongo las que utilizo, al igual que Extremo y Ricardo prefiero la primera opción

1.- Variables
ldFecha = DATE()
=SQLEXEC(wConecion, [SELECT * FROM vta_VtaC WHERE dFecha = ?ldFecha], 'Rs') < 0

2.- SP
ldFecha = DATE()
=SQLEXEC(wConecion, [MiVentas ?ldFecha], 'Rs') < 0

3.- String
DTOS() te devuelve un string en formato yyyymmdd ANSI sin verse afectado por SET DATE o SET CENTURY y Sql Server lo interpretara de forma correcta independientemente del leguaje en que este configurado.
=SQLEXEC(wConecion, [SELECT * FROM vta_VtaC WHERE dFecha >= '] + DTOS(DATE()) + ['], 'Rs') < 0

Saludos.
Mauricio

Victor Espina

unread,
May 25, 2012, 8:13:47 PM5/25/12
to publice...@googlegroups.com
A ver, para que queden las cosas claras:

a) Tu variable wdFecha es de tipo date, por lo que al intentar concatenarla con una cadena obligatoriamente te dara un error

b) La forma correcta de pasar parametros por valor en SQLEXEC() es usando el marcador ?:

SQLEXEC(nConn, "SELECT * FROM mitabla WHERE fecha>=?wdFecha","cursor")

Fijate que la variable wdFecha esta DENTRO de la cadena que define la instruccion, y que el signo ? sirve para identificar que se trata de un parametro que se le esta pasando a la instruccion.  Valga la aclaracion de que wdFecha no puede ser declarada como LOCAL, sino como PRIVATE o PUBLIC.

c) La mejor forma de pasar un parametro tipo fecha es usando directamente una variable tipo DATE o DATETIME y NUNCA concatenando el valor dentro de la sentencia SQL.  Aun asi, si quieres pasar la fecha como un string y no como una fecha, debes usar DTOS() o TTOS(), tal como te han indicado:

cFecha = DTOS(wdFecha)
SQLEXEC(nConn,"SELECT * FROM mitabla WHERE fecha >= ?cFecha","cursor")


Saludos

Victor Espina

Miltiño

unread,
May 25, 2012, 10:44:04 PM5/25/12
to Comunidad de Visual Foxpro en Español
Yo lo hago de la siguiente manera, fijate que el dato fecha después
del >= debe estar entre comillas simples.

wdFecha = DATE()
SQLEXEC(wConecion,"SELECT * FROM CORESD WHERE fecha >= '
"+dtoc(wdFecha)+"'","prueba")

ATT.

MILTON

Allan Raúl Acuña

unread,
May 25, 2012, 10:51:30 PM5/25/12
to publice...@googlegroups.com

ldDesde = Thisform.txtDesde.Value
ldHasta = Thisform.txtHasta.Value

lcSQL = "SELECT fecha, tipocambio as valor FROM TiposCambio WHERE fecha>='" + Dtoc(ldDesde) + " 12:00:00 AM' AND fecha<='" + Dtoc(ldHasta) + " 12:00:00 AM'"

SQLEXEC(wConecion, lcSQL,"prueba")

Saludos cordiales;

Lic. Allan R. Acuña
Desarrollador Independiente
msn= allan...@hotmail.com
skype= niceasysoft
            +(505) 8 831 8191      
www.NicEasySoft.com
Managua, Nicaragua
Centroamérica


> Date: Fri, 25 May 2012 19:44:04 -0700
> Subject: [vfp] Re: AYUDA CON SELECT DE FECHA EN SQL SERVER 2008
> From: servy...@hotmail.com
> To: publice...@googlegroups.com

mpulla

unread,
May 26, 2012, 12:00:12 PM5/26/12
to publice...@googlegroups.com

Hola Victor.

Dices que:

<<Valga la aclaracion de que wdFecha no puede ser declarada como LOCAL, sino como PRIVATE o PUBLIC.

Personalmente en estos casos declaro la variable como local, cuál sería el problema de hacerlo así?

Saludos.
Mauricio

Hector Kuhn

unread,
May 27, 2012, 9:19:18 AM5/27/12
to publice...@googlegroups.com
wdfecha = [']+dtos(date())+[']

Victor Espina

unread,
May 27, 2012, 11:05:54 AM5/27/12
to publice...@googlegroups.com
Si la declaras como LOCAL la variable queda fuera de alcance al ejecutarse el SQLEXEC().  Por eso debe declararse como PRIVATE o PUBLIC.

Victor Espina

Victor Espina

unread,
May 27, 2012, 11:13:22 AM5/27/12
to publice...@googlegroups.com
NicaFox.

Como ya varios companeros han  comentado, pasar como string las fechas a una consulta SQL es con mucho la forma menos recomendable de pasar valores tipo fecha (o cualquier otro tipo de valor, puestos al caso) a una consulta SQL.

La forma correcta y recomendable es pasar los valores como PARAMETROS, usando directamente la variable que contiene el valor, precedido por el signo ?.  Aplicando a tu caso seria:

ldDesde = Thisform.txtDesde.Value
ldHasta = Thisform.txtHasta.Value

lcSQL = "SELECT fecha, tipocambio as valor FROM TiposCambio WHERE fecha>='?ldDesde AND fecha<=?ldHasta'"
SQLEXEC(wConecion, lcSQL,"prueba")

Cuando tu pasas un parametro tipo DATE a una consulta SQL, y lo usas para compararlo contra una expresion DATETIME en SQL Server, el mismo servidor le anade la informacion faltante de hora (con 00:00:00) al valor tipo DATE recibido.  Si no quisieras confiarte en esto, siempre puedes usar DTOT():

ldDesde = DTOT(Thisform.txtDesde.Value)
ldHasta = DTOT(Thisform.txtHasta.Value)

Finalmente, la unica consideracion que hay que tomar, en el caso especifico de una comparacion por rango de fecha, es que la hora de la fecha HASTA debe ser 23:59:59 en lugar de 00:00:00. Una vez mas, esto es perfectamente posible desde VFP sin hacer uso de la concateniacion:

ldHasta = DTOT(THISFORM.txtHasta.Value + 1) - 1

Basicamente lo que hacemos es sumarle un dia a la fecha hasta, convertir el valor a fecha hora y luego restarle un segundo para terminar en la fecha hasta original, pero con la hora 23:59:59.

El argumento principal a favor de pasar los parametros tipo DATE o DATETIME como valores fecha y no como cadenas, es que de esta forma dejamos que sea el driver ODBC el que se encargue de convertir esa fecha a un valor que sea entendible para el servidor de datos.   Al hacerlo como concatenacion, logramos que funcione en ESE servidor, pero no hay garantia de que seguira funcionando si se cambia el tipo de base de datos a utilizar.

Saludos

Victor Espina


On Friday, May 25, 2012 9:51:30 PM UTC-5, NICAFOX wrote:

ldDesde = Thisform.txtDesde.Value
ldHasta = Thisform.txtHasta.Value

lcSQL = "SELECT fecha, tipocambio as valor FROM TiposCambio WHERE fecha>='" + Dtoc(ldDesde) + " 12:00:00 AM' AND fecha<='" + Dtoc(ldHasta) + " 12:00:00 AM'"

SQLEXEC(wConecion, lcSQL,"prueba")

Saludos cordiales;

Lic. Allan R. Acuña
Desarrollador Independiente
msn= allan...@hotmail.com
skype= niceasysoft
            +(505) 8 831 8191      
www.NicEasySoft.com
Managua, Nicaragua
Centroamérica


> Date: Fri, 25 May 2012 19:44:04 -0700
> Subject: [vfp] Re: AYUDA CON SELECT DE FECHA EN SQL SERVER 2008
> From: servy...@hotmail.com

Victor Espina

unread,
May 27, 2012, 11:14:31 AM5/27/12
to publice...@googlegroups.com
Se me fue una comilla sin querer. Donde dice:

lcSQL = "SELECT fecha, tipocambio as valor FROM TiposCambio WHERE fecha>='?ldDesde AND fecha<=?ldHasta'"

deberia decir:

lcSQL = "SELECT fecha, tipocambio as valor FROM TiposCambio WHERE fecha>=?ldDesde AND fecha<=?ldHasta'"

Saludos

Victor Espina

ARVIOS

unread,
May 27, 2012, 1:53:44 PM5/27/12
to publice...@googlegroups.com
Hola Qué diferencia hay en hacer directamente SQLEXEC y en darle primero SQLPREPARE?

Te agradezco me lo aclares. Muchas gracias de antemano

Arnoldo

Victor Espina

unread,
May 27, 2012, 3:19:46 PM5/27/12
to publice...@googlegroups.com
Cuando tu envias una instruccion SQL al servidor para su ejecucion, el servidor debe primero analizar la sentencia y luego preparar un plan de ejecucion para realizar dicha sentencia.  Cuando necesitas ejecutar esa misma instruccion muchas veces seguidas con distintos valores para sus parametros, es mas conveniente mandar a "preparar" la instruccion antes de ejecutarla.

Veamoslo con un ejemplo. Supongamos que tienes un cursor con una lista de varios archivos de inventario que deseas sacar de la venta.  Normalmente esto se podria hacer asi:

PRIVATE cCodigo
SELECT QLista
SCAN
 cCodigo = codigo
 SQLEXEC(nConn, "UPDATE articulos SET status='RETIRADO' WHERE codigo = ?cCodigo")
 SELECT QLista
ENDSCAN

Como ves, en escencia es la misma instruccion SQL ejecutada varias veces con distintos valores para su parametro ?cCodigo.  Es aqui donde el SQLPREPARE() permite reducir el tiempo de ejecucion, precompilando la instruccion SQL a ejecutar repetidamente:

PRIVATE cCodigo
cCodigo = ""
SQLPREPARE(nConn, "UPDATE articulos SET status='RETIRADO' WHERE codigo = ?cCodigo") 
SELECT QLista
SCAN
 cCodigo = codigo
 SQLEXEC(nConn)  && Ejecuta la ultima instruccion enviada con SQLPREPARE
 SELECT QLista
ENDSCAN


Saludos


Victor Espina

carlos SALCEDO

unread,
May 27, 2012, 4:50:41 PM5/27/12
to visual fox
Y si quieres mejorar la performance
- un SP o una Vista

Saludos
Carlos



Date: Sun, 27 May 2012 12:19:46 -0700
From: vesp...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] AYUDA CON SELECT DE FECHA EN SQL SERVER 2008
Reply all
Reply to author
Forward
0 new messages