我在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。
我无法理解为什么会发生这种情况。有人可以解释一下吗?
答案 0 :(得分:2)
正如评论中所述,这可能是由于价值中的前导空格。如果您执行以下操作从值中删除任何空格,它应该起作用:
SELECT *
FROM xyz
WHERE REPLACE(DataDate, ' ', '')='20140609'
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)
计为字符。然后使用like运算符作为
的查询选择 * 从 XYZ 哪里 DataDate喜欢'%20140609%'
答案 2 :(得分:0)
你可以修改下面的查询并给它一个去吗?
SELECT
*
FROM
xyz
WHERE
DataDate ='2014-06-09'