【问题标题】:How to sort Fiscal month that are stored as Nvarchar in SQL server 2008如何对在 SQL Server 2008 中存储为 Nvarchar 的会计月份进行排序
【发布时间】:2016-01-13 19:06:16
【问题描述】:

我已将会计月份存储为表中的 Nvarchar 列,并希望根据会计月份对该表进行排序。

创建表示例( id 英格 ,FiscalMonth Nvarchar(MAX) );

例如:表格包含此数据

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

有人可以帮助我如何在不更改表架构的情况下解决这个问题吗?

【问题讨论】:

  • 你不能花时间解决这个问题,而不是修复设计缺陷吗?将其存储为date/datetime 或两列yearmonth。格式化不属于数据库。
  • 这是mysql还是mssql服务器?因为你有冲突的标签?
  • 在我们了解 DBMS 之前,所有答案都是无关紧要的。问题表明他的表包含 NVARCHAR(MAX)。这在 MySQL 中不存在……所以使用 MySQL 的答案可能是多余的。

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


【解决方案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 列始终是相同的格式。

【讨论】:

    【解决方案2】:

    你可以在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

    你需要将三个字母转换成数字,即Jan-1、Feb-2、Mar-3等,然后你才能使用它的顺序。

    (同样的逻辑也可以用在 SQL Server 中,即取最后三个字符,即月份名称并将其转换为数字,然后使用 order by)

    附带说明:

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

    【讨论】:

    • 这可能行得通。但是如果你将它封装在一个函数中,你将能够重用它,并且名称将显示用途。
    • @borjab:- 是的。我只是想给出线索;)
    【解决方案3】:

    只需两步:

    • 创建一个返回财政月第一天日期的数据库函数。 fnGetFiscalFirstDay('FY15-Jul') -> 2015 年 7 月 1 日
    • 按功能排序:

      选择 * FROM 样品 按 fnGetFiscalFirstDay(s.FiscalMonth) 排序

    【讨论】:

      【解决方案4】:

      你应该给每个月一个数字,你可以用最后三个字母来区分它们。

      SUBSTRING (FiscalMonth , 5 , 3 )
      

      然后按这些数字排序。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 2011-03-13
      • 1970-01-01
      相关资源
      最近更新 更多