2014-10-06 92 views
2

我曾在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); 
+0

謝謝你的回覆,我查看了代碼,以確保我明白了(我想學習,當我通過這個)。我有一個非常大的查詢,所以當調用函數查詢時,我得到一個「表達式中未定義的函數」。我查了可能的問題,但似乎沒有涉及這個問題。我將該函數的名稱更改爲「Conversion」,因爲它被稱爲「YearList」,顯然它不能是相同的名稱,但這並沒有改變任何內容。有任何想法嗎 ?謝謝btw – Jeff 2014-10-06 21:11:21

+0

如果你改變函數的名字,一定要在兩個地方改變它:'Public Function YearList'和'YearList = varReturn'。在立即窗口測試你的功能:'?轉換(「1915-1918」)'它有效嗎? – HansUp 2014-10-06 21:17:15

+0

好吧,我不斷收到編譯錯誤,我意識到模塊名稱和他們內的程序有相同的名稱,他們不應該。一旦我改變了模塊的名稱,它就可以在即時窗口中完美編譯。我現在嘗試並實現查詢。 – Jeff 2014-10-07 13:38:03

0

在Excel中,爲期望遇到的年數範圍製作年份的順序參考表。

接下來,使用左右函數來獲取範圍的開始和結束。

創建一個更新查詢並使用目標字段串聯到它自己來更新目標字段,然後還可以在該範圍的開始和結束之間適合的參考年值。

或者我想你可以做一個用戶功能。

1

可以使用Split函數從包含上一年和下一年的「年份」字段返回一個數組。然後從較低年份開始循環到較高年份並構建連接字符串。例如:

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 
0

在查詢中添加以下代碼到一個模塊在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])