我在表中有一个varchar字段select
,其中包含此格式的数据,例如。
CC/11/2015
CC/12/2015
FA/11/2014
FA/12/2014
FA/11/2015
FA/12/2015
我想以下列方式对{{1}}查询的结果进行排序
{{1}}
首先它应该按字母顺序排序前两个字符。
然后按升序排列的剩余数字和结果应如上所述。
注意: - 数据的最后部分是年份,但中间部分不是一个月,它只是一个数字
这样做是否可行。
感谢
答案 0 :(得分:3)
这可能是您正在寻找的:
select * from table1
order by left(col1, 2), convert(date, '01/' + substring(col1, 4, 7), 103)
我的假设是最后一部分是月份+年,但当然也可能是其他部分。
答案 1 :(得分:2)
你必须这样做:
select * from temp
order by
left(columnA,2) asc ,
right(columnA,4) asc,
cast(replace(replace(columnA,left(columnA,3),''),right(columnA,5),'') as int) asc
这里有一个DEMO! 所以你编辑了帖子,这应该工作得很好。这不是将日期转换为字符串的最后一部分
答案 2 :(得分:1)
试试这个order by
。更通用的方法
ORDER BY LEFT ('FA/12/2014', Charindex('/', 'FA/12/2014') - 1),
Cast('01'+ Substring('FA/12/2014', Charindex('/', 'FA/12/2014'), 8) AS DATE)
<强>样本强>
SELECT *
FROM (VALUES ('CC/11/2015'),
('CC/12/2015'),
('FA/11/2014'),
('FA/12/2014'),
('FA/11/2015'),
('FA/12/2015')) tc (dates)
ORDER BY LEFT (dates, Charindex('/', dates) - 1),
Cast('01'
+ Substring(dates, Charindex('/', dates), 8) AS DATE)
结果:
dates
----------
CC/11/2015
CC/12/2015
FA/11/2014
FA/12/2014
FA/11/2015
FA/12/2015
答案 3 :(得分:0)
我认为你可以在这种情况下使用PARSENAME
SELECT *
FROM #Your_Table
ORDER BY Parsename(Replace(columnA, '/', '.'), 3),
Parsename(Replace(columnA, '/', '.'), 1),
Parsename(Replace(columnA, '/', '.'), 2)