我在表格中有一个日期列。日期列在 varchar 中。我想从该日期列中识别一个特定的日期范围。我的查询是这样的:
SELECT *
FROM [003 AccptReg].[dbo].[SysData1]
WHERE [RegDate_Sys] > '18 jul 2013'
但结果并没有给出准确的结果,即它给出的日期早于 2013 年 7 月 18 日。
我做错了什么吗?
我在表格中有一个日期列。日期列在 varchar 中。我想从该日期列中识别一个特定的日期范围。我的查询是这样的:
SELECT *
FROM [003 AccptReg].[dbo].[SysData1]
WHERE [RegDate_Sys] > '18 jul 2013'
但结果并没有给出准确的结果,即它给出的日期早于 2013 年 7 月 18 日。
我做错了什么吗?
对于日期列,您应该比较为DATE
select * from [003 AccptReg].[dbo].[SysData1]
where CAST([RegDate_Sys] AS DATE) > CAST('18 jul 2013' AS DATE)
问题是您将日期设置为varchar
,并且在进行比较时没有将其转换为日期。数据库不知道您将数据视为日期,并且只会将它们作为字符串进行比较,因此 example'2 jan 1736'
将大于'18 jul 2013'
because 2
come after 1
。
最好的办法是,如果您可以将数据存储为datetime
值(或date
),那么在比较这些值时就不需要进行转换,这样可以提供更好的性能。
如果这不可能,请在查询中进行转换:
select * from [003 AccptReg].[dbo].[SysData1]
where convert(datetime, [RegDate_Sys], 106) > '18 jul 2013'
根据服务器上的设置,您可能还需要以'18 jul 2013'
相同的方式进行转换,以便数据库将其正确理解为日期。
将日期转换为日期时间格式,然后进行比较:
select * from [003 AccptReg].[dbo].[SysData1]
where convert(datetime,[RegDate_Sys]) >convert(datetime,'18 jul 2013')