如何将varchar转换为SQL Server中的排序日期

时间:2015-03-10 18:17:41

标签: 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 [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

如何构建列以使排序语句正常工作?

5 个答案:

答案 0 :(得分:3)

ORDER BY子句更改为:

ORDER BY TRY_PARSE(CreatedDate AS DATE) ASC;

如果CreatedDate列包含的值不是有效日期,TRY_PARSE将返回NULL以进行排序评估,而不是抛出错误消息。

如果您可以控制表定义,请将列数据类型更改为DATE。您不必跳过箍进行排序,插入时将阻止无效的日期范围,并且需要的空间更少。

SQLFiddle

答案 1 :(得分:1)

使用CastConvert功能将varchar数据转换为Date,然后在order by中使用

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

如果使用正确的datatype(date),可以避免此类问题。

答案 2 :(得分:1)

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

CAST(CD AS DATE)

如果不是,您必须将字符串拆分并手动设为日期。

答案 3 :(得分:1)

尝试:

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

答案 4 :(得分:1)

您可以使用样式107(107 = Mon dd, yyyy)的函数CONVERT

DECLARE @Test TABLE (
    ColA VARCHAR(100)
);
INSERT @Test 
VALUES ('March 10, 2015')
,('March 6, 2015')
,('March 6, 2015')
,('March 6, 2015')
,('March 6, 2015')
,('March 6, 2015')
,('March 6, 2015')
,('March 7, 2015');

SELECT  t.ColA, CONVERT(DATE, t.ColA, 107) AS ColA_Date
FROM    @Test t
-- ORDER BY ColA_Date

结果:

ColA           ColA_Date
-------------- ----------
March 10, 2015 2015-03-10
March 6, 2015  2015-03-06
March 6, 2015  2015-03-06
March 6, 2015  2015-03-06
March 6, 2015  2015-03-06
March 6, 2015  2015-03-06
March 6, 2015  2015-03-06
March 7, 2015  2015-03-07