只捕获月份和年份(或null),然后将其转换为日期



我目前使用的客户端有一个内部开发的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完成的。

您可以使用IIfIsNullCDate函数的组合,如下所示:

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

相关内容

  • 没有找到相关文章

最新更新