从时间戳中提取数字日期(MS Access SQL-2016)

从时间戳中提取数字日期(MS Access SQL-2016),sql,datetime,ms-access,Sql,Datetime,Ms Access,我一直在尝试将时间戳字段(示例值-2020年1月6日,12:44:37.655)转换为数字日期字段,以便根据日期列进行排序 我尝试过使用DateTime和CDate,但在运行查询时,会在NewDate列中看到“#Error”。有什么建议吗 由于序号、逗号和小数,Access无法将该字符串识别为有效日期。必须使用字符串操作函数重新配置为可识别的日期/时间值 如果字符串总是有“th”、逗号和1到3位小数,请考虑: CDate(Replace(Replace(左([field])、InStrRev([

我一直在尝试将时间戳字段(示例值-2020年1月6日,12:44:37.655)转换为数字日期字段,以便根据日期列进行排序


我尝试过使用DateTime和CDate,但在运行查询时,会在NewDate列中看到“#Error”。有什么建议吗

由于序号、逗号和小数,Access无法将该字符串识别为有效日期。必须使用字符串操作函数重新配置为可识别的日期/时间值

如果字符串总是有“th”、逗号和1到3位小数,请考虑:
CDate(Replace(Replace(左([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()

结构的一致性在字符串操作中至关重要。变量越多,代码就越复杂。

您可以使用DateValue()函数

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
因此:


你想做什么并不十分清楚。当你说数字日期是什么意思时,用你想在输出时得到的值来显示它。这是一个文本类型的字段?由于Access无法将该字符串识别为有效日期,expect将不得不解析部分并重新生成。
1月1日
也会使您的第一段代码失败。我确实声明
始终具有“th”
。不过,编辑后的答案。感谢您抽出时间对6月7日做出如此全面的回复!您认为初始CDate方法会导致错误(例如nd)是正确的。这个函数很有效,我第一次用VBA做类似的尝试。我倾向于编写SQL查询并在其他SQL查询中引用它们。我肯定会更多地研究这种自定义VBA函数方法!仔细想想,这完全可以在查询中完成。请参阅修订后的answer.DateValue()以及示例字符串上的错误,原因与CDate()相同。它也会删除时间部分,但用户不会声明或建议该值是字符串,而只是希望删除时间部分。如果海报提供了更多信息,表明该列不是datetime列,则需要进行一些额外的转换。然而,我在帖子中看不到任何东西表明这是一个实际的日期时间列以外的任何东西。因此datevalue()应该可以工作,当然可以解决任何排序问题。然而,公平地说,不应该存在排序问题,因此认为这可能是一个字符串的想法是有道理的。在Access中,它不能是一个带有序号、逗号、小数的字符串吗?我从字面上考虑了示例值,因为我没有看到任何格式参数可以生成该结构。以及所述的排序问题。它可能是一个字符串-但提供的信息没有明确说明这个问题。海报上说他有一个日期/时间列数据。我确实同意,排序不应该成为一个问题。datevalue()确实去掉了时间部分,但在我们真正了解列数据类型之前,我们在这里真的不知道。有点怀疑它是否是字符串/文本类型的列。但是,如果用户应用了某种format()或试图解决其问题,那么他们可能会得到一个解析为某种字符串的表达式。我承认我们不得不在这里进行二次猜测。