我目前使用的客户端有一个内部开发的VB.NET web应用程序。他们将所有内容存储到Access数据库中,由于自身原因,他们无法更改或更改该数据库。我对这些技术都不熟悉,所以我希望你能有一个解决方案。
客户端有一个日期字段,他们只捕获mm/yyyy或为空。他们需要将这些信息保存到数据库中的日期时间字段中。我正在尝试创建一个语句,该语句将自动采用输入的日期,并从mm/yyyy转换为mm/01/yyyy(如果提供了日期),或者从01/01/1970(如果字段为空)。有人能帮忙吗?
如果我们谈论的是MS Access函数,DateSerial就是您想要的。基本语法如下。如果存储的值是文本,则需要使用Mid函数将文本解析为年和月,并且可以使用硬编码的1表示日期。
DateSerial ( year, month, day )
此功能可用于选择或更新。将需要额外的逻辑来为空白结果提供默认值。通常在Access中,这种类型的逻辑是用IIF完成的。
您可以使用IIf
、IsNull
和CDate
函数的组合,如下所示:
IIf(IsNull([YourDateFField]),#1/1/1970#,CDate([YourDateFField]))
这将测试您的字段是否为空,如果是,则返回1970年1月1日,如果否,则将您的日期字符串转换为实际日期(例如,CDate("04/2014")将返回2014年4月1日)
此(MSAccess/VBA)函数将执行您的要求。如果您传入mm/yyyy之类的字符串,它将返回mm/01/yyyy这样的日期时间。但是,如果字符串不符合该模式(或equiv),函数将返回日期时间1/1/1970,正如您所要求的那样。
'in MSAccess:
Public Function mmyyyyToDate(mmyyyy As String) As Datetime
If IsDate(Replace(mmyyyy, "/", "/01/")) Then
Return CDate(Replace(mmyyyy, "/", "/01/"))
Else
Return #1/1/1970#
End If
End Function
在MSAccess中运行它会更有效率,但如果你想在VB.net中运行它,语法就不同了:
'in VB.NET
Public Function mmyyyyToDate(mmyyyy As Object, Optional defaultDate As DateTime = "1/1/1970") As DateTime
Dim re As DateTime
If Convert.IsDbNull(mmyyyy)
return defaultDate
ElseIf DateTime.TryParse(Replace(mmyyyy, "/", "/01/"), re) Then
Return re
Else
Return defaultDate
End If
End Function
运行示例:
'MSAccess query syntax
INSERT INTO NewDateTable (NewDateColumn)
SELECT mmyyyyToDate(oldColumn) FROM OldTable
如果您不能向MSAccess DB添加新函数,您可以将此函数转换为内联语句(通过使用IIF),但它看起来很难看:
'MSAccess query syntax
INSERT INTO NewDateTable (NewDateColumn)
SELECT IIF(IsDate(Replace(oldColumn, "/", "/01/")), Replace(mmyyyy, "/", "/01/"), #1/1/1970#)
FROM OldTable