如何在SQL Server中将varchar转换为日期进行排序

如何在SQL Server中将varchar转换为日期进行排序,sql,sql-server-2012,Sql,Sql Server 2012,我有一个表,它有一列CreatedDate,类型为varchar(100)。该列的行为: CreatedDate -------------- March 6, 2015 March 6, 2015 March 6, 2015 March 6, 2015 March 6, 2015 March 6, 2015 March 7, 2015 March 10, 2015 如果执行以下查询,则日期排序不正确: SELECT * FROM [Db].[dbo].[Table1] ORDER BY

我有一个表,它有一列
CreatedDate
,类型为
varchar(100)
。该列的行为:

CreatedDate
--------------
March 6, 2015
March 6, 2015
March 6, 2015
March 6, 2015
March 6, 2015
March 6, 2015
March 7, 2015
March 10, 2015
如果执行以下查询,则日期排序不正确:

SELECT * 
FROM [Db].[dbo].[Table1] 
ORDER BY [CD] ASC
我看到以下情况:

CreatedDate
---------------
March 10, 2015
March 6, 2015
March 6, 2015
March 6, 2015
March 6, 2015
March 6, 2015
March 6, 2015
March 7, 2015

如何转换列以使排序语句正常工作?

使用
cast
Convert
函数将
varchar
数据转换为
Date
,然后按
顺序使用它

SELECT *
FROM   [Db].[dbo].[Table1]
ORDER  BY Cast([CD] AS DATE) ASC 

如果使用适当的
数据类型(日期)
可以避免此类问题。

使用
Cast
Convert
函数将
varchar
数据转换为
date
,然后按
顺序使用它

SELECT *
FROM   [Db].[dbo].[Table1]
ORDER  BY Cast([CD] AS DATE) ASC 

如果使用正确的
数据类型(日期)
可以避免此类问题。

ORDER BY
子句更改为:

ORDER BY TRY_PARSE(CreatedDate AS DATE) ASC;
如果
CreatedDate
列包含无效日期的值,则为排序计算返回NULL,而不是抛出错误消息

如果可以控制表定义,请将列数据类型更改为。排序时不必跳转,插入时将防止无效的日期范围,并且所需的空间更少


ORDER BY
子句更改为:

ORDER BY TRY_PARSE(CreatedDate AS DATE) ASC;
如果
CreatedDate
列包含无效日期的值,则为排序计算返回NULL,而不是抛出错误消息

如果可以控制表定义,请将列数据类型更改为。排序时不必跳转,插入时将防止无效的日期范围,并且所需的空间更少


假设所有数据都可以安全地转换为日期或日期时间:

CAST(CD AS DATE)

如果没有,你必须将字符串拆分,并手动将其设置为日期

假设它可以安全地转换为日期或日期时间:

CAST(CD AS DATE)
如果没有,你必须将字符串拆分,并手动将其设置为日期

试试看:

SELECT *
FROM   [Db].[dbo].[Table1]
ORDER  BY CONVERT(DATETIME,[CD],105) ASC 
尝试:


行的顺序绝对正确-对于
varchar
。这就是使用错误的数据类型所得到的结果-如果您有日期-将其存储为
日期
日期时间2(n)
!!另请参见:-您应该始终使用最合适的数据类型-毕竟,这就是它们的用途!它需要是varchar格式,以便在其他地方使用。谢谢你的批评:)你总是可以很容易地把任何东西转换成一个字符串——把数字或日期存储为字符串是没有意义的。如果你需要一个立即可用的字符串版本,你可以考虑一个计算的列来反对真正的日期值。这就是使用错误的数据类型所得到的结果-如果您有日期-将其存储为
日期
日期时间2(n)
!!另请参见:-您应该始终使用最合适的数据类型-毕竟,这就是它们的用途!它需要是varchar格式,以便在其他地方使用。谢谢你的批评:)你总是可以很容易地把任何东西转换成一个字符串——把数字或日期存储为字符串是没有意义的。如果你需要一个可以立即使用的字符串版本,你可以考虑一个计算的列。回答谢谢你的回答谢谢你的回答简单明了。谢谢你。谢谢你的回答简单明了。谢谢你的回复谢谢你的回复