2012-04-30 3 views
2

Я пытаюсь извлечь дату/время из строк со следующими шаблонами и преобразовать их в типы даты в Access.Извлечение/преобразование даты из строки в MS Access

  1. "08-Апрель-2012 21:26:49"

  2. »... Подтверждено SMITH, MD, JOHN (123) на 4/2/2012 11:11:01 AM ;»

Может ли кто-нибудь помочь?

+0

Являются ли эти два шаблона, или вы хотите иметь дело с произвольными форматами дат? –

+0

Это только два шаблона. – regulus

ответ

0

Добавьте эту функцию в модуль VBA:

' ----------------------------------------------------------------------' 
' Return a Date object or Null if no date could be extracted   ' 
' ----------------------------------------------------------------------' 
Public Function ExtractDate(value As Variant) As Variant 
    If IsNull(value) Then 
     ExtractDate = Null 
     Exit Function 
    End If 

    ' Using a static, we avoid re-creating the same regex object for every call ' 
    Static regex As Object 
    ' Initialise the Regex object ' 
    If regex Is Nothing Then 
     Set regex = CreateObject("vbscript.regexp") 
     With regex 
      .Global = True 
      .IgnoreCase = True 
      .MultiLine = True 
      .pattern = "(\d+\/\d+/\d+\s+\d+:\d+:\d+\s+\w+|\d+-\w+-\d+\s+\d+:\d+:\d+)" 
     End With 
    End If 
    ' Test the value against the pattern ' 
    Dim matches As Object 
    Set matches = regex.Execute(value) 
    If matches.count > 0 Then 
     ' Convert the match to a Date if we can ' 
     ExtractDate = CDate(matches(0).value) 
    Else 
     ' No match found, jsut return Null ' 
     ExtractDate = Null 
    End If 
End Function 

И затем использовать его, как это, например, в запросе:

SELECT ID, LogData, ExtractDate(LogData) as LogDate 
FROM MyLog 

Убедитесь, что вы подтвердили, что даты возврата hte соответствуют вашему формату и имеют смысл для вас. CDate() интерпретирует строку даты различными способами в зависимости от вашей локали.

Если вы не получили желаемый результат, вам нужно будет изменить код, чтобы разделить отдельные компоненты даты и перестроить их, например, с помощью DateSerial().

1

Попробуйте

Dim d As Date 
    d = CDate("08-Apr-2012 21:26:49") 
    Debug.Print Format(d, "dd-MMM-yyyy") 
    Debug.Print Format(d, "h:m:s") 

Даст

08-Apr-2012 
21:26:49 

использовать это регулярное выражение, чтобы получить дату и время между "на" (то есть, пространство на пространстве) и ";" (первая половина двоеточия после этого).

(?<=\ on)(.*?)(?=\;) 
+0

CDate работает для первого шаблона, но все еще не уверен, как справиться со вторым. Сначала мне нужно извлечь дату из строки. – regulus

1

Как уже упоминалось Ромео в his answer, вам нужно использовать CDate() для преобразования строки с допустимым значением даты в Date переменной.

Вы можете получить значение даты из строки, как это:
(при условии, что струны всегда выглядят, как в примере, «на» (с пробелами) до даты и «;» после него) :

Public Function Test() 

    Dim Source As String 
    Dim Tmp As String 
    Dim DateStart As Integer 
    Dim DateEnd As Integer 
    Dim DateValue As Date 

    Source = "...Confirmed by SMITH, MD, JOHN (123) on 4/2/2012 11:11:01 AM;" 

    'find the place in the source string where " on " ends 
    DateStart = InStr(1, Source, " on ") + 4 

    'find first semicolon after the date) 
    DateEnd = InStr(DateStart, Source, ";") 

    'get the part with the date 
    Tmp = Mid(Source, DateStart, DateEnd - DateStart) 

    'convert to date 
    DateValue = CDate(Tmp) 

End Function 
Смежные вопросы