web-dev-qa-db-fra.com

Requête comparant des dates en SQL

J'ai une table avec des dates qui se sont toutes déroulées au mois de novembre. J'ai écrit cette requête

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

Cette requête doit renvoyer tout ce qui s'est passé au mois 11 (novembre) car c'est ce qui s'est passé avant la date '2013-04-12' (en décembre)

Mais il ne renvoie que les dates disponibles qui se sont déroulées dans des jours inférieurs à 04 (2013 -4 - 12)

Se pourrait-il qu'il ne s'agisse que de comparer la partie jour? et pas toute la date?

Comment régler ceci?

Created_date est de type date

Le format de date est par défaut aaaa-jj-MM

64
HelpASisterOut

Au lieu de '2013-04-12' dont la signification dépend de la culture locale, utilisez '20130412' qui est reconnu comme format invariant de la culture.

Si vous voulez comparer avec le 4 décembreth, vous devriez écrire '20131204'. Si vous voulez comparer avec le 12 avrilth, vous devriez écrire '20130412'.

L'article Write International Transact-SQL Statements extrait de la documentation de SQL Server explique comment écrire des instructions invariantes de la culture:

Les applications qui utilisent d'autres API, ou des scripts Transact-SQL, des procédures stockées et des déclencheurs, doivent utiliser les chaînes numériques non séparées. Par exemple, aaaammjj comme 19980924.

EDIT

Étant donné que vous utilisez ADO, la meilleure option consiste à paramétrer la requête et à transmettre la valeur de date en tant que paramètre de date. De cette façon, vous évitez entièrement le problème de format et bénéficiez également des performances des requêtes paramétrées.

UPDATE

Pour utiliser le format ISO 8601 dans un littéral, tous les éléments doivent être spécifiés. Pour citer extrait de la section ISO 8601 de la documentation de datetime

Pour utiliser le format ISO 8601, vous devez spécifier chaque élément dans le format. Cela inclut également le T, les deux points (:) et le point (.) Affichés dans le format.

... la fraction de deuxième composant est facultative. La composante heure est spécifiée au format 24 heures.

64
Panagiotis Kanavos

Essayez comme ça

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

Si vous comparez uniquement avec la valeur de la date, le convertir en date (et non pas date/heure) fonctionnera

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

Cette conversion est également applicable lors de l’utilisation de GetDate () function

6
Bimzee

Vous mettez <= et la date indiquée sera également saisie. Vous pouvez le remplacer par < uniquement.

4
Kuzgun

veuillez essayer avec la requête ci-dessous

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')
2
Naresh Pansuriya

Essayez d'utiliser "#" avant et après la date et assurez-vous du format de date de votre système. peut-être "AAAAMMJJ O AAAA-MM-JJ O MM-JJ-AAAA O UTILISATION '/ O \'"

Ex:

 select id,numbers_from,created_date,amount_numbers,SMS_text 
 from Test_Table
 where 
 created_date <= #2013-04-12#
1
Ren Marín

Le format de date est aaaa-mm-jj. Donc, la requête ci-dessus est à la recherche d'enregistrements plus anciens que 12avr2013

Nous vous suggérons de procéder à une vérification rapide en définissant la chaîne de date sur '2013-04-30'. Si aucune erreur SQL ne survient, le format de la date est confirmé en aaaa-mm-jj.

0
Bowie