Sql 在日期范围为varchar的特定日期范围之间选择数据

Sql 在日期范围为varchar的特定日期范围之间选择数据,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,我有一个varcharreporttime,它存储了日期。别问我为什么它是一个varchar 我这样做是为了在两个日期之间获取数据: select rowid from batchinfo where CONVERT(DATE, reporttime, 103) between '2010-07-01' and '2010-07-31' 而且它不起作用 我做错了什么 顺便说一句,数据是这样的: rowid datapath

我有一个varchar
reporttime
,它存储了日期。别问我为什么它是一个varchar

我这样做是为了在两个日期之间获取数据:

select rowid 
 from batchinfo 
where CONVERT(DATE, reporttime, 103) between '2010-07-01' and '2010-07-31'
而且它不起作用

我做错了什么

顺便说一句,数据是这样的:

rowid   datapath                                                        analysistime       reporttime
4695    F:\MassHunter\DATA\6897_Pan_1\QuantResults\6897_Pan_1.batch.bin  1/2/2010 8:13 AM   1/2/2010 8:25 AM
4696    F:\MassHunter\DATA\6897_Pan_2\QuantResults\6897_Pan2.batch.bin   1/2/2010 8:21 AM   1/2/2010 8:33 AM
4697    F:\MassHunter\DATA\6903_Pan_1\QuantResults\6903_P1.batch.bin     1/2/2010 9:41 AM   1/2/2010 9:46 AM
4698    F:\MassHunter\DATA\6903_Pan_2\QuantResults\6903_Pan2.batch.bin   1/2/2010 9:50 AM   1/2/2010 9:57 AM
4699    F:\MassHunter\DATA\6915_Pan_1\QuantResults\6915_pan1.batch.bin   1/2/2010 10:09 AM  1/2/2010 10:33 AM

首先,我假设你的样本数据不合格,是吗

其次,您可能仍然在进行字母数字比较,而不是日期时间比较。尝试此操作以强制进行日期时间比较

select rowid 
from batchinfo 
where CONVERT(DATE, reporttime, 103)
    between cast('2010-07-01' as datetime) and CAST('2010-07-31' as datetime)

CAST操作符类似于CONVERT,也可以使用CONVERT。

CONVERT样式103是dd/mm/yyyy(欧洲格式),因此您可以颠倒月份和日期。尝试改用101。

要查找错误数据,请尝试以下操作:

SELECT *
FROM batchinfo 
WHERE IsDate(reporttime) = 0

从字符串转换日期和/或时间时,Msg 241,级别16,状态1,第1行转换失败。该错误来自此转换(日期,报告时间,103)-您的post示例中没有显示错误值吗?Bobs的解决方案对我很有效。是的,我也看到了。在您的解决方案中,尝试更改每个日期字符串以使用CONVERT,
CONVERT(日期,'2010-07-01',103)
。或者,您可以尝试将您的第一次转换更改为转换(日期、报告时间、101)`。美国格式适用于我,因此可能与地区有关。我不能这样做,因为您可以看到reporttime是这种格式的:1/2/2010 8:25 AMI在CONVERT中看到了相同的问题(日期,reporttime,103)。当我将103更改为101时,原始解决方案有效。从字符串转换日期和/或时间时,Msg 241,级别16,状态1,第1行转换失败。我想问题是,我在其中有几秒钟,我想我需要在第一个空格之前完成所有操作。当我尝试它时,该方法有效:
选择转换(日期,'1/2/2010 8:13:02 AM',101)
对我来说也是如此,但是当我从batchinfo中选择convert(日期,reporttime,101)时,它会给我16级错误,你在
varchar
列中得到了一些错误数据。另一个例子说明了为什么使用适当的数据类型如此重要。