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

筛选SQL Server中存储为varchar的日期,sql,sql-server,sql-server-2008,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Sql Server 2008 R2,我在EC2实例上使用SQL Server 2008 R2。我有一个数据库,它有4个字段,全部为varchar(50) 这个查询没有结果 SELECT * FROM xyz WHERE DataDate = (Select MAX(DataDate) from xyz) 这个查询运行得很好 Select MAX(DataDate) from xyz 此查询的结果为20140609 我不明白为什么会这样。有人能解释一下吗?你能按如下方式修改查询并试一试吗 SELECT * FROM

我在EC2实例上使用SQL Server 2008 R2。我有一个数据库,它有4个字段,全部为varchar(50)

这个查询没有结果

SELECT
 *
FROM
 xyz
WHERE
 DataDate = (Select MAX(DataDate) from xyz)
这个查询运行得很好

Select MAX(DataDate) from xyz 
此查询的结果为20140609


我不明白为什么会这样。有人能解释一下吗?

你能按如下方式修改查询并试一试吗

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

你能按如下方式修改查询并试一试吗

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

如评论中所述,这可能是由于值中的前导空格。如果执行以下操作以从值中删除任何空格,则该操作应有效:

SELECT *
FROM  xyz
WHERE REPLACE(DataDate, ' ', '')='20140609'
或者,您可以使用/函数来执行此操作

这两个查询都可以同时进行:

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) 

如评论中所述,这可能是由于值中的前导空格。如果执行以下操作以从值中删除任何空格,则该操作应有效:

SELECT *
FROM  xyz
WHERE REPLACE(DataDate, ' ', '')='20140609'
或者,您可以使用/函数来执行此操作

这两个查询都可以同时进行:

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) 

在sql空间中,计数为字符。然后使用like运算符将此查询作为

挑选 * 从…起 xyz 哪里
sql空间中类似“%20140609%”的DataDate将作为字符计数。然后使用like运算符将此查询作为

挑选 * 从…起 xyz 哪里
类似于“%20140609%”的数据日期

Nothing。它适用于我的其他日期(类似类型)。它只是不适用于此条目。DataDate列也在varchar中,而不是在date中。您是否有特定的原因将日期列设置为varchar格式,否则可以尝试更改该表?max函数将只应用于字符串,不会给出dateNothing的最大值。它适用于我的其他日期(类似类型)。它只是不适用于此条目。DataDate列也在varchar中,而不是在date中。您是否有特定的原因将日期列设置为varchar格式,否则可以尝试更改该表?max函数只适用于字符串,不会给出日期的最大值
DataDate
列的类型是什么?如果它是varchar类型,那么这一行中的
20140609
后面可能有尾随选项卡?可以显示示例数据吗?为什么要在varchar(50)列中存储日期?在我想知道为什么结果不如预期之前,我会先解决这个问题。我想,正如前面提到的,问题在于前导/尾随空格/制表符。
DataDate
列的类型是什么?如果它是varchar类型,那么这一行中的
20140609
后面可能有尾随选项卡?可以显示示例数据吗?为什么要在varchar(50)列中存储日期?在我想知道为什么结果不如预期之前,我会先解决这个问题。我想,正如前面提到的,问题在于前导/尾随空格/制表符。真棒的人。。。谢谢我试试看。我不能改成DateTime,因为我既不是数据的提供者,也不是用户。非常抱歉。@JayNirgudkar没问题,我知道您可能无法更改数据,但它可能会帮助您,也会帮助将来查看此问题的任何其他人。真棒的人。。。谢谢我试试看。我不能改成DateTime,因为我既不是数据的提供者,也不是用户。非常抱歉。@JayNirgudkar没问题,我知道您可能无法更改数据,但它可能会帮助您,也会帮助将来查看此问题的任何其他人。