如何在给定领域将年份范围拆分为单独的年份?

Posted

技术标签:

【中文标题】如何在给定领域将年份范围拆分为单独的年份?【英文标题】: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

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

【问题讨论】:

【参考方案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])的查询中调用它

【讨论】:

以上是关于如何在给定领域将年份范围拆分为单独的年份?的主要内容,如果未能解决你的问题,请参考以下文章

Java - 在指定的给定月份 - 年份范围内打印每个月的第一个和最后一个日期

EXCEL 拆分日期后年份

基于创建年份将对象的数组拆分为子数组

Objective-C:查找给定年份和年份的日期

日期范围内给定年份的天数

如何创建一个新列来指定日期所属的年份范围(如学年)?