2015-10-15 39 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)

相關問題