在Sql Server 2008中我有一个数据库表,数据包含一个字段,表示一个时间段:2d,1w,4y,其中“d”=天,“w”=周,“y” =年。基于此字段排序的最佳方法是什么,以便它们按时间顺序排列(例如“1y”之前的“3w”)?
由于
答案 0 :(得分:2)
我猜你很幸运,d在w之前,W也在y之前,所以你可以做到
ORDER BY RIGHT(MyField, 1), CONVERT(int, LEFT(Field, LEN(Field) - 1))
然而,例如,这不会在8d之前放置1w。
所以另一种(更复杂的)解决方案可能是
ORDER BY
CASE RIGHT(Field, 1)
WHEN 'd' THEN LEFT(Field, LEN(Field) - 1)
WHEN 'w' THEN 7*LEFT(Field, LEN(Field) - 1)
ELSE 356 * LEFT(Field, LEN(Field) - 1)
END
它假设你的数据(例如只有d,w和y会在那里),并没有考虑闰年(如果重要的话)。
答案 1 :(得分:2)
您可能会有不同的时间段。所以我会将这些时段放在一个新的表中,其中包含ID,时间段和排序顺序(或天数)。在初始表中,将字段替换为time_period_id,并在查询中进行连接,并在SORT BY中使用它。
答案 2 :(得分:1)
用字符串编号替换字符,并在排序前转换为整数,如:
convert(int, replace(replace(replace(myField,'d',''),'w','0')'y','00'))
所以你的3D是3,2w是20而4y是400。
答案 3 :(得分:0)
我的方法是编写一个函数来解析你的持续时间字符串,并以可以表达的最小可能单位对其进行标准化(我假设它是几天,但如果你可以有几小时或一些较小的单位表达,请使用那)。然后,有一个计算列,该列是针对您的列调用的函数的值。那时,这只是比较数字的问题。当然,细节中的魔鬼......我不喜欢尝试解析T-SQL中的文本。