2015-10-15 41 views
1

我已将Fiscal月存储为表中的Nvarchar列,并且希望根据会计月对该表进行排序。如何对SQL Server 2008中存储为Nvarchar的会计月进行排序

创建表样品( ID Ineger ,FiscalMonth NVARCHAR(MAX) );

实施例:表包含此数据现在

Id FiscalMonth 
----------------- 
1  FY15-Oct 
2  FY15-Sep 
3  FY15-Jul 
4  FY15-Aug 

如果我在由FiscalMonth列结果为了将这个表进行排序:
SELECT * FROM样品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 

有人可以帮助我如何对这个问题的方法不改变表的模式?

+1

难道你不能花时间来解决这个问题,而是为了解决设计缺陷吗?可以将它存储为'date' /'datetime'或两个列'year'和'month'。格式不属于数据库。 –

+0

这是mysql还是mssql服务器?你有标签冲突吗? – JBond

+0

所有的答案都是无关的,直到我们知道DBMS。问题表明他的表包含NVARCHAR(MAX)。这在MySQL中不存在......所以使用MySQL的答案可能是多余的。 – JBond

回答

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列始终是相同的格式。

0

你应该给每个月的一个数字,区分他们你可以为最后三个字母。

SUBSTRING (FiscalMonth , 5 , 3) 

然后按那些数字排序。

+0

今年呢? 2014 DEC应该在2015年之前APR – borjab

+0

好的,你可以用DATEADD函数建立一个日期。阅读更多:https://msdn.microsoft.com/en-us/library/ms186819.aspx –

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应用以及即采取最后三个charaters即月份名称,并将其转换成数字,然后通过使用顺序)

在一个侧面说明:

将列创建为日期时间,然后您可以存储该值并使用日期时间函数轻松完成此操作将是一个好主意。

+0

这可能工作。但是,如果你将它封装在一个函数中,你将能够重用它并且名字将显示目的。 – borjab

+0

@borjab: - 是的。我只是想提供线索;) –

0

只需两步:

  • 创建数据库机能的研究,返回财政月份的第一天的日期。fnGetFiscalFirstDay( '2015财年-JUL') - > 2015年7月1日
  • 排序功能:

    SELECT * FROM 试样S ORDER BY fnGetFiscalFirstDay(s.FiscalMonth)

相关问题