【问题标题】:How do I split up a year range into individual years in a given field?如何在给定领域将年份范围拆分为单独的年份?
【发布时间】:2014-10-06 18:16:08
【问题描述】:

我在 Access 中查询了几个表,发现表中的某一列不满足特定要求。

我有一个包含数千条记录的字段,它包含以下格式的“年”(示例):1915-1918

我想要完成的是使该价值在记录中成为个人。所以 最终结果将是:1915,1916,1917,1918

基本上,我想将1915-1918 转换为1915,1916,1917,1918

我认为一个简单的串联就足够了,但我无法思考如何制作它,以便它可以为所有数千条记录做到这一点。我做了一些研究并得出结论,用户定义的功能可能是要走的路。我该怎么办?

【问题讨论】:

    标签: sql ms-access vba ms-access-2013


    【解决方案1】:

    当您的字段值由 4 位数字、短划线和 4 位数字组成时,此函数会返回以逗号分隔的年份列表。

    在任何其他情况下(Null、单一年份,例如“1915”而不是年份范围,或其他任何情况),该函数返回起始值。

    Public Function YearList(ByVal pInput As Variant) As Variant
        Dim astrPieces() As String
        Dim i As Long
        Dim lngFirst As Long
        Dim lngLast As Long
        Dim varReturn As Variant
    
        If pInput Like "####-####" Then
            astrPieces = Split(pInput, "-")
            lngFirst = CLng(astrPieces(0))
            lngLast = CLng(astrPieces(1))
            For i = lngFirst To lngLast
                varReturn = varReturn & "," & CStr(i)
            Next
            If Len(varReturn) > 0 Then
                varReturn = Mid(varReturn, 2)
            End If
        Else
            varReturn = pInput
        End If
        YearList = varReturn
    End Function
    

    但是,此方法假定每个范围内的开始年份将小于结束年份。换句话说,您需要投入更多的精力让YearList("1915-1912") 返回一个年份列表而不是一个空字符串。

    如果该函数返回您想要的,您可以在 SELECT 查询中使用它。

    SELECT years_field, YearList(years_field)
    FROM YourTable;
    

    或者,如果您想替换年字段中存储的值,您可以在 UPDATE 查询中使用该函数。

    UPDATE YourTable
    SET years_field = YearList(years_field);
    

    【讨论】:

    • 感谢您的回复,我查看了代码以确保我理解(我想通过这个来学习)。我有一个相当大的查询,所以当调用函数到查询时,我得到一个“表达式中的未定义函数”。我查找了可能的问题,但似乎没有一个与这个问题有关。我将函数的名称更改为“Conversion”,因为它被称为“YearList”,显然它不能是相同的名称,但这并没有改变任何东西。有任何想法吗 ?谢谢顺便说一句
    • 如果您更改函数的名称,请确保在两个地方都进行更改:Public Function YearListYearList = varReturn。在即时窗口中测试您的功能:? Conversion("1915-1918") 是否有效?
    • 好的,我不断收到编译错误,我意识到模块名称和其中的过程具有相同的名称,但它们不应该如此。一旦我更改了模块的名称,它就会在即时窗口中完美编译。我现在将尝试在查询中实现。
    • 好的,我搞定了。由于不必要的空格,我不得不更新 Year 字段,这会影响代码并使其无法正常运行。我有一个问题,它启动了一个名为“Expr1001”的全新字段,有没有办法可以让我在查询中替换我的 Year 字段,或者我必须在字段本身上使用更新查询?
    • 我不确定你现在在问什么。如果要更改存储的值,请使用 UPDATE 查询。如果这是关于 SELECT 查询中的列名,请使用别名。但是,当您想重用字段名称作为字段表达式的别名时,这可能会很棘手。而当字段名是Year等保留字时,可能会更具挑战性。
    【解决方案2】:

    您可以使用Split 函数从“years”字段返回一个包含上下年份的数组。然后从低年循环到高年并构建连接字符串。例如:

    Public Function SplitYears(Years As String) As String
        Dim v As Variant
        Dim i As Long
        Dim s As String
    
        v = Split(Years, "-", 2)
        If UBound(v) = 1 Then
            For i = v(0) To v(1)
                s = s & "," & CStr(i)
            Next i
            s = Right(s, Len(s) - 1)
        Else
            s = v(0)
        End If
        SplitYears = s
    
    End Function
    

    【讨论】:

      【解决方案3】:

      在 Excel 中,为您希望遇到的年份范围制作年份的顺序参考表。

      接下来,使用 left 和 right 函数获取范围的开始和结束。

      创建一个更新查询并更新目标字段,将目标字段连接到自身,然后更新它们之间的参考年份值,也适合范围的开始和结束。

      或者我猜你可以创建一个用户函数。

      【讨论】:

        【解决方案4】:

        将以下代码添加到 Visual Basic 中的模块中

        Public Function CommaDates(Start_End) As String
            Dim strt As String
            Dim endd As String
            Dim x As Long
        
            strt = Left(Start_End, 4)
            endd = Right(Start_End, 4)
            CommaDates = strt
        
            For x = strt + 1 To endd
                CommaDates = CommaDates & "," & x
            Next x
        End Function
        

        在类似NEW_DATE: CommaDates([OLD_DATE_FIELD_NAME])的查询中调用它

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-03
          相关资源
          最近更新 更多