Преобразовать текст в DateTime в доступе - PullRequest
0 голосов
/ 01 сентября 2011

Итак, у меня есть поле, в котором тип данных представляет собой текст, который подается в базу данных.Это возвращает что-то вроде этого:

ддд МММ дд чч: мм: сс гггг

То, что я хотел бы для этого сделать, будет отображаться какчто-то вроде этого:

ддд МММ дд гггг чч: мм: сс

Я могу добиться этого с помощью Format (), который будет выглядеть так:

Format(alarmdet.AlarmStart, "ddd MMM dd yyyy hh:mm:ss) AS AlarmDateTime

Так что это все хорошо, однако;Я хочу иметь возможность преобразовать это значение в дату и время.Я пытался использовать CVDate, CDate, DateValue и каждый раз, когда мне возвращали ошибку, указывающую на несовпадающий тип данных.Как бы я мог преобразовать эту точную строку в дату-время?

Примечание:

Итак, вы знаете, я могу заставить его успешно конвертировать, когда вАнглийский (США), но я пытаюсь заставить его работать в португальском (Португалия).В этой локали я получаю ошибку несоответствия типов данных, которая, я думаю, как-то связана с тем, как доступ считывает сокращенные месяцы.Что-то мне не хватает, чтобы это успешно работало в международных условиях?

Также я хотел бы преобразовать нечто похожее на это в другом поле, чтобы оно выглядело так:

ММ / дд / гггг

Опять же, я знаю, что могу получить это, используя Format (), но я бы хотел, чтобы его преобразовали в DateTime.Как бы я поступил так?

Любая помощь или предложения с благодарностью.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 01 сентября 2011

Мне кажется, первая задача - прочитать вашу пользовательскую строку в качестве правильной даты.В вашем предыдущем вопросе вы задали его как пример строки, хранящейся в вашем поле [AlarmStart]:

Tue Jan 18 10:10:57 2011

Проблема в том, что VBA не распознает эту строку как содержащую действительную дату/ Значение времени.

? IsDate("Tue Jan 18 10:10:57 2011")
False

Однако, если вы измените эту строку (отбросьте день недели и переместитесь на год раньше времени), вы можете создать строку, которую VBA распознает как действительную дату.

? IsDate("Jan 18 2011 10:10:57")
True

Таким образом, вы можете использовать функцию, чтобы разделить строку, переставить нужные вам части и вернуть значение даты / времени.

Public Function DateFromCustomString(ByVal pIn As String) As Variant
    Dim varPieces As Variant
    Dim strNew As String
    Dim varReturn As Variant

    varPieces = Split(pIn)
    strNew = Join(Array(varPieces(1), varPieces(2), varPieces(4), _
        varPieces(3)), " ")
    If IsDate(strNew) Then
        varReturn = CDate(strNew)
    Else
        varReturn = Null
    End If
    DateFromCustomString = varReturn
End Function

(Функции Split () и Join () доступны начиная с Access 2000).

И, как только вы получите значение Date / Time из вашей строки, вы можете использоватьфункция Format () для ее отображения по вашему усмотрению.

Format(DateFromCustomString(alarmdet.AlarmStart), "ddd MMM dd yyyy hh:mm:ss") AS AlarmDateTime
Format(DateFromCustomString(alarmdet.AlarmStart), "mm/dd/yyyy") AS AlarmDate

Работает, как описано с английскими сокращениями названий месяцев.Я не знаю, что будет с португальским.

0 голосов
/ 01 сентября 2011

Использование

Strings.FormatDateTime("2011-09-01",vbGeneralDate) 
0 голосов
/ 01 сентября 2011

Вы можете использовать объект словаря, чтобы преобразовать английскую аббревиатуру месяца в число независимо от вашей локали. Приведенная ниже функция преобразует формат, который вы перечислили выше, в действительную дату / время. Возможно, вы захотите написать лучший обработчик ошибок.

Public Function textToDate(text As String) As Date
    Dim months As Object
    Dim year As String
    Dim month As String
    Dim day As String
    Dim time As Date

    On Error GoTo eh

    text = Trim(text)

    Set months = CreateObject("Scripting.Dictionary")
    months.Add "Jan", 1
    months.Add "Feb", 2
    months.Add "Mar", 3
    months.Add "Apr", 4
    months.Add "May", 5
    months.Add "Jun", 6
    months.Add "Jul", 7
    months.Add "Aug", 8
    months.Add "Sep", 9
    months.Add "Oct", 10
    months.Add "Nov", 11
    months.Add "Dec", 12

    year = Right(text, 4)
    month = months(Mid(text, 5, 3))
    day = Mid(text, 9, 2)
    time = CDate(Mid(text, 12, 8))

    textToDate = CDate(DateSerial(year, month, day) + time)
Exit Function
eh:
    textToDate = #1/1/1900#
End Function

EDIT: Если вы в конечном итоге используете это решение, используйте метод Split () HansUp, а не мой mid (); это намного чище и безопаснее.

...