如何对在SQL Server 2008中存储为Nvarchar的会计年度进行排序

时间:2015-10-15 10:53:14

标签: mysql sql sql-server sql-server-2008

我已将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

有人可以帮我解决这个问题而不改变表的架构吗?

4 个答案:

答案 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)

只需两步:

  • 创建一个数据库功能,返回会计月份第一天的日期。 fnGetFiscalFirstDay('FY15-Jul') - &gt; 2015年7月1日
  • 按功能排序:

    SELECT *  来自样本 订购fnGetFiscalFirstDay(s.FiscalMonth)