我有一个包含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
如何构建列以使排序语句正常工作?
答案 0 :(得分:3)
将ORDER BY
子句更改为:
ORDER BY TRY_PARSE(CreatedDate AS DATE) ASC;
如果CreatedDate
列包含的值不是有效日期,TRY_PARSE将返回NULL以进行排序评估,而不是抛出错误消息。
如果您可以控制表定义,请将列数据类型更改为DATE。您不必跳过箍进行排序,插入时将阻止无效的日期范围,并且需要的空间更少。
答案 1 :(得分:1)
使用Cast
或Convert
功能将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