2011-08-31 58 views
0

因此,我有一个字段,即数据类型是送入数据库的文本。它返回什么是沿着这线的东西:在访问中将文本转换为日期时间

DDD MMM DD HH:MM:SS YYYY

什么,我想它做的是显示为这样的事:

DDD MMM DD YYYY HH:MM:SS

我可以通过使用格式()实现这一目标,其看起来像这样:

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

然而,这一切都很好,我希望能够将此值转换为日期时间。我尝试过使用CVDate,CDate,DateValue,每次我返回一个声明不匹配数据类型的错误。我将如何将这个确切的字符串转换为日期时间?

注:

那么,你是知道的,我能够得到它成功地转换成英语(美国)区域时,但我试图得到这个在葡萄牙工作(葡萄牙)区域设置。在这个语言环境中,我得到了不匹配的数据类型错误,我认为这与访问读取被泄露月份的方式有关。我错过了什么让它在国际环境中成功地工作?

此外,我想一些类似的转换在不同的领域有它看起来像这样:

MM/DD/YYYY

再次我知道我可以用得到这个格式(),但我想转换成DateTime。我将如何去做这件事?

任何帮助或建议,非常感谢。

谢谢。

+0

您需要添加什么样的文本字符串真正的样子,请例子吗?如果MMM值与英文月份名称相同,则可能是问题的一部分。您可能需要将字符串格式化为美国日期时间,然后使用CDate将其保存为日期时间,然后将您的语言环境设置为葡萄牙语,并再次进行格式化以适应葡萄牙语命名数月。 –

+0

这是一个演示级问题,而不是SQL问题。你为什么认为你在SQL中需要这种格式? –

回答

2

对我来说,第一个挑战就是阅读你的自定义字符串作为有效日期。在your previous question,你给这个存储在您的[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 

(分割()和join()函数可以开始访问2000)

而且,一旦你从你的字符串的日期/时间值,你可以使用Format()函数来显示它,但是你喜欢。

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

这与英文月份名称缩写描述一致。我不知道葡萄牙会发生什么。

+0

我试过使用这个函数,它看起来应该工作,但是我运行查询时出现错误:未定义的函数DateFromCustomString我检查了拼写并确保它的模块名称不一样。我甚至试图从构建器中获取这个函数,但仍然得到相同的错误。任何想法为什么这可能是? – James213

+0

当您在即时窗口中尝试它时,该功能是否被识别? ...'Debug.Print DateFromCustomString(“Tue Jan 18 10:10:57 2011”)' – HansUp

+0

是的,当我运行上面的语句输出到:'1/18/2011 10:10:57 AM' – James213

0

您可以使用字典对象将英文月份缩写转换为数字,而不考虑您的语言环境。下面的函数将把上面列出的格式转换为有效的日期/时间。你可能会想写一个更好的错误处理程序。

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 

编辑: 如果你最终使用该解决方案使用HansUp的split()方法,而不是我的MID();它更干净更安全。

0

使用

Strings.FormatDateTime("2011-09-01",vbGeneralDate) 
+1

呃,这个如何在Access/VBA/SQL中工作? –

相关问题