Consulta comparando dates en SQL

Tengo una tabla con las dates que todo sucedió en el mes de noviembre. Escribí esta consulta

select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where created_date <= '2013-04-12' 

Esta consulta debe devolver todo lo que sucedió en el mes 11 (noviembre) porque ocurrió antes de la date '2013-04-12' (en diciembre)

Pero solo devuelve dates disponibles que ocurrieron en días menores que 04 (2013-04-12)

¿Podría ser que solo está comparando la parte del día? y no la date completa?

¿Cómo arreglar esto?

Fecha_creado es del tipo date

El formatting de date es por defecto aaaa-dd-MM

En lugar de '2013-04-12', cuyo significado depende de la cultura local, use '20130412', que se reconoce como el formatting de cultura invariante.

Si quiere comparar con el 4 de diciembre, debe escribir '20131204'. Si quiere comparar con el 12 de abril, debe escribir '20130412'.

El artículo Write International Transact-SQL Statements de la documentation de SQL Server explica cómo escribir declaraciones que son invariantes para la cultura:

Las aplicaciones que usan otras API, o secuencias de commands de Transact-SQL, procedimientos almacenados y desencadenadores, deben usar las cadenas numéricas separadas. Por ejemplo, aaaammdd como 19980924.

EDITAR

Como está utilizando ADO, la mejor opción es parametrizar la consulta y pasar el valor de date como un parámetro de date. De esta forma, evita por completo el problema de formatting y también obtiene los beneficios de performance de las consultas parametrizadas.

ACTUALIZAR

Para usar el formatting ISO 8601 en un literal, se deben especificar todos los elementos. Para citar de la sección ISO 8601 de la documentation de date y hora

Para usar el formatting ISO 8601, debe especificar cada elemento en el formatting. Esto también incluye la T, los dos puntos (:) y el punto (.) Que se muestran en el formatting.

… la fracción del segundo componente es opcional. El componente de time se especifica en el formatting de 24 horas.

Intenta así

 select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where created_date <= '2013-12-04' 

Pones <= y captará la date dada también. Puedes replacelo por < solo.

Por favor, intente con la consulta a continuación

 select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where convert(datetime, convert(varchar(10), created_date, 102)) <= convert(datetime,'2013-04-12') 

Si está comparando solo con el vale de date, entonces conviértalo en date (no en date y hora ).

 select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where created_date <= convert(date,'2013-04-12',102) 

Esta conversión también es aplicable durante el uso de la function GetDate ()

Intente usar "#" antes y después de la date y asegúrese de que el formatting de date del sistema. tal vez "AAAAMMDD O AAAA-MM-DD O MM-DD-AAAA O UTILIZANDO '/ O \'"

Ex:

  select id,numbers_from,created_date,amount_numbers,SMS_text from Test_Table where created_date <= #2013-04-12# 

El formatting de date es aaaa-mm-dd. Por lo tanto, la consulta anterior está buscando loggings anteriores a 12Apr2013

Te sugerimos que hagas una comprobación rápida estableciendo la cadena de date en '2013-04-30', si no hay ningún error SQL, el formatting de date se confirma en aaaa-mm-dd.

    Intereting Posts