sql server:我的日期数据出了什么问题?

时间:2010-09-08 16:01:32

标签: sql sql-server tsql

我有一个包含日期的列,但它是一个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

我确保这些都不是一个糟糕的日期:

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

此返回0结果

问题: 我需要在某个范围之间返回日期:

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

我收到了这个错误;

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

我的转换有什么问题?

5 个答案:

答案 0 :(得分:2)

如果您需要存储日期,请在将来使用日期时间列

这有用吗?

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

如果在运行之前不使用SET DATEFORMAT MDY

如果你必须将它存储在varchar列中,那么使用YYYYMMDD格式......你可以这样做

WHERE reporttime like '201008%'如果你想要2010年8月

答案 1 :(得分:1)

在查询之前输入SET DATEFORMAT MDY。

答案 2 :(得分:1)

这将解决您的问题:

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'

试试这个以查看问题所在:

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

答案 3 :(得分:0)

请注意,此CAST('2010-08-31' as datetime)的时间部分为00:00

考虑将varchar数据转换为smalldatetime,并具体说明您之间的时间边界。无需转换,子串等。只需要一个CAST即可。

将此视为一种潜在的解决方案:

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

答案 4 :(得分:0)

这也将删除时间部分

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)