如何在给定领域将年份范围拆分为单独的年份?
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 YearList
和 YearList = 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])
的查询中调用它
【讨论】:
以上是关于如何在给定领域将年份范围拆分为单独的年份?的主要内容,如果未能解决你的问题,请参考以下文章