server sql: quel est le problème avec mes données de date?

J'ai une colonne avec des dates, mais c'est un varchar:

8/31/2010 9:48 8/31/2010 9:49 8/31/2010 9:51 8/31/2010 9:52 8/31/2010 9:55 8/31/2010 9:59 8/31/2010 10:11 8/31/2010 10:13 8/31/2010 10:16 8/31/2010 10:37 8/31/2010 10:42 

J'ai fait en sorte que rien de tout cela ne soit une date MAUVAISE:

 SELECT * FROM qcvalues.dbo.batchinfo WHERE ISDATE(reporttime) <> 1 

ceci a returnné 0 résultats

question: je dois returnner des dates entre une certaine gamme:

 select rowid from qcvalues.dbo.batchinfo where CONVERT(DATE, Subssortingng( reporttime, 1, LEN(reporttime)), 103) between cast('2010-08-01' as datetime) and CAST('2010-08-31' as datetime) 

et je reçois cette erreur;

 Msg 241, Level 16, State 1, Line 2 Conversion failed when converting date and/or time from character ssortingng. 

qu'est-ce qui ne va pas avec ma conversion?

Cela résoudra votre problème:

 select rowid from qcvalues.dbo.batchinfo where CONVERT(DATE, reporttime, 101) >= '20100801' -- style 101, not 103 -- also notice date conversion invariant format YYYYMMDD with no separators AND CONVERT(DATE, reporttime, 101) < '20100901' -- using BETWEEN with an end date of '8/31/2010' will skip -- times between '8/31/2010 00:00:00.003' and '8/31/2010 23:59:59.997' 

Essayez ceci pour voir quel est le problème:

 select convert(datetime, '8/31/2010 9:48', 103) select convert(datetime, '8/31/2010 9:48', 101) 

Si vous devez stocker des dates, utilisez une colonne datetime dans le futur

Est-ce que ça marche?

 WHERE CONVERT(DATE,RTRIM(reporttime)) BETWEEN '2010-08-01' and '2010-08-31' 

Si ce n'est pas le cas, utilisez SET DATEFORMAT MDY avant de l'exécuter

Et si vous devez le stocker dans une colonne varchar, utilisez le format YYYYMMDD … comme vous pouvez le faire

WHERE reporttime like '201008%' si vous voulez août 2010

Mettez SET DATEFORMAT MDY avant votre requête.

Cela supprimera la partie time

 select rowid from qcvalues.dbo.batchinfo Where cast(floor(cast(cast(reportTime as datetime)as float))as datetime) between cast('2010-08-01' as datetime) and cast('2010-08-31' as datetime) 

Rappelez-vous, ce CAST('2010-08-31' as datetime) aura sa partie time comme 00:00 .

Pensez à diffuser vos données varchar en tant que petites dates, et en vous concentrant sur les limites des time intermédiaires. Pas besoin d'être converti, sous-string, etc. Juste un CAST fera l'affaire.

Considérez ceci comme une solution potentielle:

 SELECT rowid from qcvalues.dbo.batchinfo WHERE CAST(reporttime as smalldatetime) BETWEEN '2010-08-01' AND '2010-08-31 23:59'