如何在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格式,以便在其他地方使用。谢谢你的批评:)你总是可以很容易地把任何东西转换成一个字符串——把数字或日期存储为字符串是没有意义的。如果你需要一个可以立即使用的字符串版本,你可以考虑一个计算的列。回答谢谢你的回答谢谢你的回答简单明了。谢谢你。谢谢你的回答简单明了。谢谢你的回复谢谢你的回复