我正在使用Microsoft Access数据库。在数据库中,有一个备注字段,其中一些数据与日期一起存储。我试图从这个领域提取月份和年份,但我有点困难。
日期和备注的存储方式没有统一性。例如,在某些专栏中,它将是" REMARK MM / DD / YYYY"而在其他专栏中,它可能是" MM / DD / YYYY REMARK。"评论的长度各不相同。该字段存储为字符字段。
我们现在需要使用输入此列的月份和年份(而不是日期本身),我正在寻找一种方法来轻松提取此数据并将其放入同一个表中的两个单独的列中,因为这些数据将与用户输入的字符串进行比较。 (即,它会根据用户给出的变量生成包含特定月份和年份的所有数据的查询,因此我们会说它会在2014年1月找到所有被标记为缺席的人 - 这部分工作正常除了在特定月份和年份中查找人员之外的所有内容,因为它当前返回所有在一段时间内输入的缺席用户)。
我已经创建了用于存储数据的列,并简单地将它们称为“月份”。和'年'。遗憾的是,我没有设计数据库(它是在大约10年前构建的)而且我只有非常基本的SQL知识。我也使用Access 2002,因为不幸的是我无法访问更新的版本。非常感谢您对此主题给予的任何帮助。
答案 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()
函数获取所需的值。