【问题标题】:ms access db order by month asc issuems access db order by month asc issue
【发布时间】:2010-08-14 07:39:23
【问题描述】:

在我的数据库中,我的月份名称为 1 月、2 月、3 月。

我表示字段名称是文本。当我执行按月份字段月份排序的选择查询时,它将提供二月、一月这样的输出。

我知道 FORMAT 或 db 字段表示很清楚。虽然我是 ms 访问的新手,所以我不知道正确的格式。请帮我。

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    你必须在一个模块中创建你自己的自定义函数来为你转换值。

    类似

    Public Function StrToMonth(strIn As String) As Integer
    Dim arrMonth(12) As Variant
    Dim i As Integer
    
    arrMonth(0) = "January"
    arrMonth(1) = "February"
    arrMonth(2) = "March"
    arrMonth(3) = "April"
    arrMonth(4) = "May"
    arrMonth(5) = "June"
    arrMonth(6) = "July"
    arrMonth(7) = "August"
    arrMonth(8) = "September"
    arrMonth(9) = "October"
    arrMonth(10) = "November"
    arrMonth(11) = "December"
    
    For i = 0 To UBound(arrMonth) - 1
    If strIn = arrMonth(i) Then
    StrToMonth = i + 1
    Exit Function
    End If
    Next i
    End Function
    

    然后您可以在查询中使用它,例如

    SELECT Table1.MonthVal
    FROM Table1
    ORDER BY StrToMonth([MonthVal]);
    

    【讨论】:

    • 我认为一个额外的表和一个连接会比函数更快。
    • 我认为您不需要自定义函数。有几种纯 sql 的可能性。
    【解决方案2】:

    向表中添加一个额外的列,其月份名称具有年份中的月份数,或者更好,不要将月份存储为字符串,而是将它们存储为日期,例如2010 年 8 月 1 日,这将使这个问题更容易解决。

    【讨论】:

    • 好的。有没有其他方法可以按顺序进行对话(如order by month(``..field name``) asc)?
    • 我不是 Access 方面的专家 - 但我希望您可以通过计算订购,并且该计算可以是 '1/' + 月 + '/2010' 或类似的 - 即按日期订购.
    • 查找表建议会执行得更好,因为对表达式的排序不能利用索引。
    • @David - 我完全同意 - 我建议的方法不是“理想的”!
    【解决方案3】:

    将月份存储为整数,因为当前使用字母排序返回您的行(数据库如何知道这些字符串存在月份?):April、August、February、January、March...

    【讨论】:

      【解决方案4】:

      您可以将月份转换为日期以进行排序:

      SELECT MonthName
      FROM SomeTable
      ORDER BY CDate("1/" & [MonthName] & "/2010");
      

      【讨论】:

        【解决方案5】:

        如果您认为将月份存储为实际日期是不合适的(当然可能——我并不是在批评该决定),您希望通过以最有效的格式存储数据来最大限度地提高性能.

        这很可能将月份存储为整数。

        出于显示目的,例如在报告或表单中,您可以使用格式显示月份名称。这有点棘手,因为没有直接转换(其中“MonthField”是指您存储月份整数的字段):

          Format(DateSerial(Year(Date()), MonthField, 1), "mmmm")
        

        另一种方法是使用一个将月份整数映射到月份名称的表,但这会添加一个连接,如果该字段可以为空,则必须有一个外部连接,而且成本要高得多在性能方面比内部连接。

        请记住,您只能在表示层中使用 Format() 语句,即,作为表单或报表上的控件的控制源。在表单上,​​您可能会为此使用 2 列组合框,因此用户会看到月份名称,但存储的值实际上是月份整数。在这种情况下,表格可能有意义,但我不确定它是否比仅输入值列表具有任何真正的优势——这不像是易失性数据,即可能需要编辑的数据(这是您使用表格代替值列表的主要原因)!

        编辑:

        正如@HansUp 所指出的,VBA 中有一个 MonthName() 函数(我不知道它存在!),所以这使得上述所有方法比它需要的更复杂——你可以在表示层不需要表格或复杂的 Format() 语句。

        【讨论】:

        • 如果 MonthField 包含整数值,使用MonthName(MonthField)
        • 我不知道有这个功能!每天学习新东西!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-20
        • 2016-12-31
        • 2017-01-20
        • 2020-03-09
        • 2020-02-19
        • 1970-01-01
        相关资源
        最近更新 更多