Consulta SQL con fechas desde variables

Soy Javier, (el de los campos memo), un saludote y dos nuevas preguntas, que me están retrasando un tema:
1ª) Tengo una consulta SQL a la base de datos SQL Server +/- como sigue:
SELECT * FROM noticias WHERE fecha>=vfecha1 AND TOPE>= VFECHA2
En la que necesito registros comprendidos entre dos fechas que han de provenir de dos variables:
vfecha1 =date()
vfecha2=date()-7
El problema es que parece que SQL invierte el formato de fecha y la clausula SQL no funciona.
¿Cómo lo harías?
2ª) En una tabla de SQL Server en la que el campo clave es un autocontador, no me deja añadir registros nuevos si estos provienen de una tabla de Access en la que el campo clave ya dispone de un dato y este coincide con alguno de los que ya tiene la BD de SQL.
¿Habría qué cambiar alguna propiedad en el campo autocontador?
Gracias por tu atención y aprovecho para enviarte un saludote.
Javier.
Respuesta
1
Respuesta 1:
Lo que tienes que hacer es utilizar la función CONVERT y elegir el formato que quieras utilizar. Echa un vistazo a esta función en la ayuda.
SELECT * FROM noticias WHERE fecha>=CONVERT(vfecha1, ...)
Con ella consigues que siempre te haga la misma conversión, creo que lo que te ocurre es que te está tomando por defecto el formato americano (mes-día-año) en vez del que estamos habituados (día-mes-año).
Respuesta 2:
En primer lugar te recomiendo que no utilices campos autonuméricos, pues aunque en un principio parecen cómodos a la larga solo dan problemas. Definete una tabla de contadores y trabaja con los tuyos propios.
Para solucionar el problema en concreto tendría que saber como estás importando los datos (con DTS, con SELECT INTO, con INSERT INTO, con BULK INSERT, con BCP )
En algunos de estos mandatos tienes un parámetro para que te coja el valor que tiene en el origen (lo que te puede generar duplicados) o que le asigne el siguiente nº automáticamente, no coincidiendo entonces este nº con el original, pero evitando problemas de claves duplicadas.
Pd. Por favor, no olvides finalizar la pregunta. Si tienes dudas no tienes más que decirlo.
Hola Salvador, he intentado usar la función CONVERT tal y como me comentas y la he probado de 1000 maneras, o no la entiendo o no se que .
Al final he localizado la diferencia entre la función de access DATE() y la que parece que es equivalente de SQL GETDATE().
He realizado la consulta en la misma linea SQL, tal y como sigue, pero aunque funciona no es lo que yo buscaba:
---> WHERE fecha>=getdate()-10 AND tope>=getdate()
Con respecto a la segunda respuesta: he mirado el código SQL que genera el asistente de consultas de Access y el meto do que utiliza es INSERT INTO.
Gracias otra vez y quedo en espera
En cuanto a la primera segunda, perdoname porque me confundía, la función CONVERT la utilizo para convertir una cadena de caracteres a fecha. Si siempre coges las del sistema, efectivamente GETDATE() es la forma correcta.
En cuanto a la segunda:
Te recomiendo que utilices BULK INSERT, con esta instrucción puedes decidir si mantener o no los valores originales, mira el pará metro KEEPIDENTITY:
Esta clausula especifica que los valores de una columna de identidad están presentes en el archivo que se importa. Si no se especifica KEEPIDENTITY, se omiten los valores de identidad de esta columna en el archivo de datos que se importa y SQL Server asigna automáticamente valores únicos basados en los valores de inicialización y de incremento especificados durante la creación de la tabla
Muchas Gracias Salvador por tu atención en el tema de Inserción de registros, pero el problema era que yo por hacerlo desde un formulario de Access, para poder tener más interacción que desde un formulario web, hacía que el formulario de access realizase una consulta de añadido de registros y claro como Access usa (sin poder cambiar el método) la cláusula INSERT INTOpués no funcionaba.
Lo he intentado cambiando en el código SQL de Access pero como ya te he dicho, no lo admite.
Osea que tendré que utilizar no un autocontador (tal y como tu decías), sino un campo numérico manual.
Gracias por tu atención y hasta la próxima.
Adiós.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas