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