我已将Fiscal month存储为表中的Nvarchar列,并希望根据会计月份对该表进行排序。
创建表格样本( id Ineger ,FiscalMonth Nvarchar(MAX) );
Ex:表包含此数据
Id FiscalMonth
-----------------
1 FY15-Oct
2 FY15-Sep
3 FY15-Jul
4 FY15-Aug
现在,如果按照FiscalMonth列的顺序对此表进行排序,结果将是:
SELECT * FROM sample ORDER BY FiscalMonth;
结果:
Id FiscalMonth
-----------------
4 FY15-Aug
3 FY15-Jul
1 FY15-Oct
2 FY15-Sep
但我希望结果为
预期产出:
Id FiscalMonth
-----------------
3 FY15-Jul
4 FY15-Aug
2 FY15-Sep
1 FY15-Oct
有人可以帮我解决这个问题而不改变表的架构吗?
答案 0 :(得分:1)
对不同年份进行排序,然后按月对MS SQL中的order by
进行排序:
SELECT [Id],[FiscalMonth]
From Sample
order by convert(date,Substring([FiscalMonth],6,3)+ ' 01 ' + Substring([FiscalMonth],3,2),103)
这假设您的FiscalMonth
列始终采用相同的格式。
答案 1 :(得分:0)
你应该每个月给一个数字,在最后三个字母中区分它们。
SUBSTRING (FiscalMonth , 5 , 3 )
之后按那些数字排序。
答案 2 :(得分:0)
您可以在MYSQL中尝试这样做
SELECT myDate
FROM myTest
ORDER BY
LEFT(myDate,2),
CAST(MID(myDate,2) AS UNSIGNED),
MONTH(STR_TO_DATE(RIGHT(myDate,3),'%b'))
<强> SQL FIDDLE DEMO 强>
或只是
SELECT myDate
FROM myTest
ORDER BY
MONTH(STR_TO_DATE(RIGHT(myDate,3),'%b'))
<强> SQL FIDDLE DEMO 强>
您需要将三个字母转换为数字,即1月1日,2月2日,3月3日等等,然后您可以使用该订单。
(同样的逻辑也可以在SQL Server中应用,即采用最后三个字符,即月份名称并将其转换为数字,然后按使用顺序)
旁注:
最好将列创建为日期时间,然后您可以存储该值并使用datetime函数轻松完成此操作。
答案 3 :(得分:0)
只需两步:
按功能排序:
SELECT * 来自样本 订购fnGetFiscalFirstDay(s.FiscalMonth)