• Viernes 26 de Abril de 2024, 23:33

Autor Tema:  Ayudilla  (Leído 3305 veces)

carlos_lue

  • Miembro activo
  • **
  • Mensajes: 83
    • Ver Perfil
Ayudilla
« en: Jueves 13 de Enero de 2005, 21:50 »
0
Hola a todos, alguin me puede ayudar con este codigo, lo que pasa es que no recuerdo como se utiliza el BETWEEN, si alguin me puede proporcionar un manual, gracias..


SELECT Producto.Descripcion
FROM Factura, Producto WHERE Factura.Fecha BETWEEN '"01/01/2005" AND "25/01/2005"';

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Ayudilla
« Respuesta #1 en: Jueves 13 de Enero de 2005, 22:33 »
0
Tu problema no es como se usa el BETWEEN, es de conversion de datos

<!--sql--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>SQL </td></tr><tr><td id='CODE'><!--sql1-->[color=blue;font-weight]SELECT[/color] Producto.Descripcion
FROM Factura, Producto
WHERE to_number( to_char(Factura.Fecha,'yyyymmdd'))
BETWEEN 20050101 AND 20050125;
<!--sql2--></td></tr></table><div class='postcolor'><!--sql3-->
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

mateamargo

  • Miembro activo
  • **
  • Mensajes: 67
    • Ver Perfil
Re: Ayudilla
« Respuesta #2 en: Viernes 21 de Enero de 2005, 16:33 »
0
Cita de: "carlos_lue"
Hola a todos, alguin me puede ayudar con este codigo, lo que pasa es que no recuerdo como se utiliza el BETWEEN, si alguin me puede proporcionar un manual, gracias..


SELECT Producto.Descripcion
FROM Factura, Producto WHERE Factura.Fecha BETWEEN '"01/01/2005" AND "25/01/2005"';
Hiciste casi todo bien, excepto por dos detalles.
Las fechas en SQL se escriben con el formato 'yyyy-mm-dd' y el otro es el uso de las comillas. Recordá que se usan comillas simples ' y no las dobles ". Vos hiciste una combinación de ambas. Arreglando eso no deberías de tener problemas en la consulta, siempre y cuando ambos campos sean del tipo DateTime.

O sea, quedaría así:

Código: Text
  1.  
  2. SELECT Producto.Descripcion
  3. FROM Factura, Producto
  4. WHERE Factura.Fecha BETWEEN '2005-01-01' AND '2005-01-25';
  5.  
  6.  

Saludos.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Ayudilla
« Respuesta #3 en: Viernes 21 de Enero de 2005, 16:37 »
0
mateamargo loq eu has explicado es SQL Server verdad?
porque en SQL standart no funciona.

Por otro lado lo del formato de la fecha  es falso que

Citar
se escriben con el formato 'yyyy-mm-dd'

pues normalmente es una variable de entorno la que define el formato de la fecha para aparecer en pantalla y es modificable ese formato  apartir del uso de to_char, claro que ya veo que usas SQL Server y es bien conocido que no siempre manejan las cosas dentro del stantdart asi que creo que lo que has usado si funciona en este motor de BD.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

mateamargo

  • Miembro activo
  • **
  • Mensajes: 67
    • Ver Perfil
Re: Ayudilla
« Respuesta #4 en: Viernes 21 de Enero de 2005, 17:07 »
0
Esa sintaxis a mi me funciona, es más, el libro en el que yo consulto dice que ese es el formato del ANSI SQL por defecto, así que debería funcionar tanto en SQL Server como en otros.
Aunque deduzco que el ; que está al final de la sentencia lo puso porque es un SQL Embebido en alguna aplicación.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Ayudilla
« Respuesta #5 en: Viernes 21 de Enero de 2005, 17:17 »
0
NO, REALMENTE NO ES SQL STANDART :(

Cosas como el GetDate
y la manera en que puedes usar el beteween
y lo del formato de la fecha son propias de SQL Server y access

pero no funcionan en Oracle ni en MySQL ni en SYBASE.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

mateamargo

  • Miembro activo
  • **
  • Mensajes: 67
    • Ver Perfil
Re: Ayudilla
« Respuesta #6 en: Viernes 21 de Enero de 2005, 17:24 »
0
Ahí no se menciona el GetDate(), y si no funiconan en el resto es porque estarán usando su lenguaje basado en ANSI SQL y no el ANSI en sí mismo.
A parte, el Access no tiene nada que ver, ya que todas las bases se acceden mediante ODBC, o sea, esas sentencias son independientes de la BD que uses.
Saludos.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Ayudilla
« Respuesta #7 en: Viernes 21 de Enero de 2005, 18:07 »
0
Cita de: "mateamargo"
Ahí no se menciona el GetDate(), y si no funiconan en el resto es porque estarán usando su lenguaje basado en ANSI SQL y no el ANSI en sí mismo.
A parte, el Access no tiene nada que ver, ya que todas las bases se acceden mediante ODBC, o sea, esas sentencias son independientes de la BD que uses.
Saludos.
Creo que estas equivocado.

Lo del GetDate es nu hecho que es propio de SQL Server, el standart en los motores es usar Sysdate.

Y lo de access y odbc .... no te entendi

El odbc es solo una manera de acceder a los datos pero no quiere decir que solo se pueda hacer de esa forma, de hecho no necesitas crear un ODBC para acceder a access ni a SQL Server ni a MySql ni a Oracle... puedes hacerlo pero no es necesesario, todo de pende de que cosas vayas a hacer y de como las quieras hacer.

Por lo general las sentencias SQL y PL/SQL usadas de forma embebida dentro de un ambiente de desarrollo diferente del propio motor de la base de datos suele tener variaciones dependiendo de la tecnologia usada, segun el caso ODBC, JDBC etc ya que la libreria de conexion se encarga de hacer la traduccion a las particularidades de la base de datos o bien del standart que uses.

Para el caso especifico este foro es de SQL, por eso digo que algunas sentencias no siguen el standart mientras que en si el post estuviese en SQL Server no importa el standart sino que funcione y ya, al igual si fuera una pregunta de VB o de java ya que habria que acomodar las respuestas a las necesidades de cada libreria en la medida de lo posible.

EN TODO CASO ME PARECE QUE TUS RESPUESTAS SON IGUALMENTE VALIDAS pues muchas personas no conocen estos aspectos tecnicos
asi que en la medida que puedas me gustaria que tambien contestaras los post que salgan en caso de que tengas una variante para hacerlo.  :)   :smartass:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

mateamargo

  • Miembro activo
  • **
  • Mensajes: 67
    • Ver Perfil
Re: Ayudilla
« Respuesta #8 en: Viernes 21 de Enero de 2005, 18:56 »
0
Creo que no me entendiste con lo que quise decir sobre el GetDate(). Esta función es propia del SQL Server, pero en el ejemplo que di arriba no la mencioné, por ahí sonó confuso.
También dijiste algo sobre Access. La cuestión es que las sintaxis de SQL son indistintas a las bases de datos donde se las apliquen. ODBC es una forma de conectarse a ellas, hay otras también.
Por lo del SQL embebido, por ejemplo, en PowerBuilder sí o sí se tienen que terminar con punto y coma las sintaxis, por eso mi deducción.
Saludos JuanK.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Ayudilla
« Respuesta #9 en: Viernes 21 de Enero de 2005, 19:02 »
0
Citar
También dijiste algo sobre Access. La cuestión es que las sintaxis de SQL son indistintas a las bases de datos donde se las apliquen.

en teoria ...
pero las sentencias que has usado no funcionan en ORACLE, en MYSQL (al menos la version que tengo) ni en SYBASE.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

mateamargo

  • Miembro activo
  • **
  • Mensajes: 67
    • Ver Perfil
Re: Ayudilla
« Respuesta #10 en: Viernes 21 de Enero de 2005, 19:27 »
0
Cita de: "JuanK"
Citar
También dijiste algo sobre Access. La cuestión es que las sintaxis de SQL son indistintas a las bases de datos donde se las apliquen.

en teoria ...
pero las sentencias que has usado no funcionan en ORACLE, en MYSQL (al menos la version que tengo) ni en SYBASE.
¿Qué error te aparece?
¿estás seguro que esos lenguajes soportan el ANSI a parte de su adaptación?

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Ayudilla
« Respuesta #11 en: Viernes 21 de Enero de 2005, 22:38 »
0
<!--sql--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>SQL </td></tr><tr><td id='CODE'><!--sql1-->[color=blue;font-weight]SELECT[/color] p.clap_producto, p.grup_producto
FROM ENCA_FACTURA f, PRODUCTO p
WHERE f.efac_fecha BETWEEN '2005-01-01' AND '2005-01-25'
<!--sql2--></td></tr></table><div class='postcolor'><!--sql3-->

Arroja el error:
Citar
ORA-01861 literal does not match format string

Lo cual segun Knowledge Xpert para PL/SQL es:
Citar
Cause: Literals in the input must be the same length as literals in the format string (with the exception of leading white space). If the "FX" modifier has been toggled on, the literal must match exactly, with no extra white space.

Action: Correct the format string to match the literal.

Como te comente es debido a que el between no funciona de esa maner en los motores de bases de datos estandart (SQL Server por muchas razones no lo es)

El between solo puede decir si una variable numerica se encuentra entre un rango de numeros estrablecido, y una fecha no es un numero asi que hay que hacer nua conversion
Asi que la forma correcta de usarlo es:
<!--sql--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>SQL </td></tr><tr><td id='CODE'><!--sql1-->[color=blue;font-weight]SELECT[/color] p.clap_producto, p.grup_producto
FROM ENCA_FACTURA f, PRODUCTO p
WHERE TO_NUMBER (TO_CHAR (f.efac_fecha, 'yyyymmdd')) BETWEEN 20050101 AND 20050125
<!--sql2--></td></tr></table><div class='postcolor'><!--sql3-->

Lo cual convuierte el dato tipo fecha a nuo tipo char con un formato especifico, y seguidamente se convierte a number con el fin de poder realizar la comparacion numerica.

Otra opcion seria
<!--sql--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>SQL </td></tr><tr><td id='CODE'><!--sql1-->[color=blue;font-weight]SELECT[/color] p.clap_producto, p.grup_producto
FROM ENCA_FACTURA f, PRODUCTO p
WHERE TO_CHAR (f.efac_fecha, 'yyyymmdd') BETWEEN '20050101' AND '20050125'
<!--sql2--></td></tr></table><div class='postcolor'><!--sql3-->

Ya que la conversion de una cadena de texto que represente literalmente un numero se realiza de manera automatica.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io