【问题标题】:Separating a Date from surrounding text将日期与周围的文本分开
【发布时间】:2015-01-29 19:46:16
【问题描述】:

我正在使用 Microsoft Access 数据库。在数据库中,有一个备注字段,其中一些数据与日期一起存储。我正在尝试从该字段中提取月份和年份,但我遇到了一些困难。

日期和备注的存储方式没有统一性。例如,在某些列中,它将是“REMARK MM/DD/YYYY”,而在其他列中,它可能是“MM/DD/YYYY REMARK”。 cmets 本身具有不同的长度。该字段存储为字符字段。

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

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

【问题讨论】:

标签: sql ms-access extract


【解决方案1】:

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

  • 一位或两位小数
  • 斜线
  • 多一个或两个十进制数字
  • 斜线
  • 还有四位小数

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

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() 函数获取您需要的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2022-10-23
    • 1970-01-01
    • 2015-04-09
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多