将日期与周围文本分开

时间:2015-01-28 16:29:23

标签: sql ms-access extract

我正在使用Microsoft Access数据库。在数据库中,有一个备注字段,其中一些数据与日期一起存储。我试图从这个领域提取月份和年份,但我有点困难。

日期和备注的存储方式没有统一性。例如,在某些专栏中,它将是" REMARK MM / DD / YYYY"而在其他专栏中,它可能是" MM / DD / YYYY REMARK。"评论的长度各不相同。该字段存储为字符字段。

我们现在需要使用输入此列的月份和年份(而不是日期本身),我正在寻找一种方法来轻松提取此数据并将其放入同一个表中的两个单独的列中,因为这些数据将与用户输入的字符串进行比较。 (即,它会根据用户给出的变量生成包含特定月份和年份的所有数据的查询,因此我们会说它会在2014年1月找到所有被标记为缺席的人 - 这部分工作正常除了在特定月份和年份中查找人员之外的所有内容,因为它当前返回所有在一段时间内输入的缺席用户)。

我已经创建了用于存储数据的列,并简单地将它们称为“月份”。和'年'。遗憾的是,我没有设计数据库(它是在大约10年前构建的)而且我只有非常基本的SQL知识。我也使用Access 2002,因为不幸的是我无法访问更新的版本。非常感谢您对此主题给予的任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用利用regular expressions的自定义VBA函数来查找匹配的字符串...

  • 一位或两位小数
  • 斜线
  • 一个或两个以上的十进制数字
  • 斜线
  • 四位小数

...将这些数值分开并返回日期值,如下所示:

Option Compare Database
Option Explicit

Public Function ExtractDateFromText(TextToSearch As String) As Variant
    Dim rgx As Object  ' RegExp
    Dim rgxMatches As Object  ' MatchCollection
    Dim rgxMatch As Object  ' Match
    Dim yyyy As Integer, mm As Integer, dd As Integer
    Dim rtn As Variant

    Set rgx = CreateObject("VBScript.RegExp")  ' New RegExp
    rgx.Pattern = "(\d{1,2})/(\d{1,2})/(\d{4})"
    Set rgxMatches = rgx.Execute(TextToSearch)
    If rgxMatches.Count = 0 Then
        rtn = Null
    Else
        Set rgxMatch = rgxMatches(0)
        mm = Val(rgxMatch.SubMatches(0))
        dd = Val(rgxMatch.SubMatches(1))
        yyyy = Val(rgxMatch.SubMatches(2))
        rtn = DateSerial(yyyy, mm, dd)
    End If

    Set rgxMatch = Nothing
    Set rgxMatches = Nothing
    Set rgx = Nothing

    ExtractDateFromText = rtn
End Function

然后,您可以使用提取的日期值更新表格中的日期/时间字段

UPDATE Table1 SET Table1.DateFromRemark = ExtractDateFromText([remark]);

然后使用Year()Month()函数获取所需的值。