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'