筛选在SQL Server中存储为varchar的日期

时间:2014-07-02 09:44:50

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我在EC2实例上使用SQL Server 2008 R2。我有一个数据库有4个字段的所有varchar(50)。

 SELECT
 *
FROM
 xyz
WHERE
 DataDate ='20140609'

此查询没有结果。

SELECT
 *
FROM
 xyz
WHERE
 DataDate = (Select MAX(DataDate) from xyz)

此查询运行完美。

Select MAX(DataDate) from xyz 

此查询结果为20140609。

我无法理解为什么会发生这种情况。有人可以解释一下吗?

3 个答案:

答案 0 :(得分:2)

正如评论中所述,这可能是由于价值中的前导空格。如果您执行以下操作从值中删除任何空格,它应该起作用:

SELECT *
FROM  xyz
WHERE REPLACE(DataDate, ' ', '')='20140609'

或者,您可以使用LTRIM / RTRIM函数执行此操作。

Sample SQL Fiddle

create table SampleData(myDate varchar(50))

insert into SampleData(myDate) values(' 20140609 ')
insert into SampleData(myDate) values('20140608')
insert into SampleData(myDate) values('20140607')
insert into SampleData(myDate) values('20140606')

这两个查询都在小提琴中起作用:

SELECT *
FROM  SampleData
WHERE REPLACE(myDate, ' ', '')='20140609'

Select MAX(REPLACE(myDate, ' ', '')) from SampleData 

未来建议:

即便如此,出于多种原因将日期保存为varchar并不是一个好主意,所以我建议如果可能的话将其更改。

如果您的日期始终采用YYYYMMDD格式

,则以下内容会对现有数据执行转换,将其转换为有效日期,同时删除任何空格
SELECT cast(REPLACE(DataDate, ' ', '') as DateTime) FormattedDate
FROM  xyz

要实现这一点,您可以在表格上创建一个新的DateTime列,并使用下面的内容将正确的日期值插入其中,然后修改您的代码以使用新列:

首先在表格中添加一个新列:

ALTER TABLE xyz 
ADD FormattedDate DateTime NULL

然后更新新列中的数据,使其保留转换后的日期:

UPDATE xyz
SET FormattedDate = cast(REPLACE(DataDate, ' ', '') as DateTime) 

答案 1 :(得分:2)

在sql空间中的

计为字符。然后使用like运算符作为

的查询

选择  * 从  XYZ 哪里  DataDate喜欢'%20140609%'

答案 2 :(得分:0)

你可以修改下面的查询并给它一个去吗?

 SELECT
 *
FROM
 xyz
WHERE
 DataDate ='2014-06-09'