从时间戳中提取数字日期(ms access sql-2016)

gijlo24d  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(447)

我一直在尝试将时间戳字段(示例值-2020年1月6日,12:44:37.655)转换为数字日期字段,以便根据日期列进行排序。
我尝试过使用datetime和cdate,但在运行查询时,会在newdate列中看到“#error”。有什么建议吗?

6l7fqoea

6l7fqoea1#

由于序号、逗号和小数,access无法将该字符串识别为有效日期。必须使用字符串操作函数重新配置为可识别的日期/时间值。
如果字符串总是有“th”、逗号和1到3个小数位,请考虑: CDate(Replace(Replace(Left([field], InStrRev([field], ".") - 1), "th", ""), ",", "")) 如果需要删除时间组件,可以使用datevalue()。
但是,我假设会有没有小数的值以及不同的序数,这个表达式将失败。以下假设hh:mm:ss始终为8个字符:

SELECT *, Left([Test],InStr([Test]," ")) AS Mo, 
Val(Mid([Test],InStr([Test]," "))) AS Dy, 
Mid([Test],InStrRev([Test],",")-5,5) AS Yr, 
Mid(Test,InStrRev(Test,",")+1,9) AS Tm, 
CDate([Mo] & [Dy] & [Yr] & [Tm]) AS NewDate
FROM Table;

可能会发现调用自定义vba函数更方便。

Function ConvDate(strDte As String) As Date
Dim Mo As String, Dy As String, Yr As String, Tm As String
Mo = Left(strDte, InStr(strDte, " "))
Dy = Val(Mid(strDte, InStr(strDte, " ")))
Yr = Mid(strDte, InStrRev(strDte, ",") - 5, 5)
Tm = Mid(strDte, InStrRev(strDte, ",") + 1, 9)
ConvDate = CDate(Mo & Dy & Yr & Tm)
End Function

如果要删除时间部分,请不要连接提取的组件或对返回的日期/时间值使用datevalue()。
在字符串操作中,结构的一致性是至关重要的。变化越多,代码就越复杂。

d5vmydt9

d5vmydt92#

可以使用datevalue()函数。
因此:

select ID, InvoiceAmount, DateValue([InvoiceDTime]) as InvoiceDate
ORDER BY DateValue([InvoiceDTime])

相关问题