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

时间:2014-04-16 14:28:34

标签: asp.net vb.net ms-access datetime

我目前正在与一个内部开发的VB.NET Web应用程序的客户端合作。他们已经将所有内容存储到Access数据库中,他们无法根据自己的原因进行更改或更改。我不熟悉这些技术,所以我希望你有一个解决方案。

客户端有一个日期字段,它们只捕获mm / yyyy或空白。他们需要此信息才能保存到数据库中的日期时间字段。我正在尝试编写一个语句,该语句将自动获取输入的日期,并在提供日期时从mm / yyyy转换为mm / 01 / yyyy,如果字段为空,则为01/01/1970。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

如果我们谈论MS Access功能,DateSerial就是你要找的。基本语法如下。如果存储的值是文本,您将需要使用Mid函数将文本解析为年份和月份,并且您可以使用当天使用硬编码的1。

DateSerial ( year, month, day )

此功能可用于选择或更新。将需要额外的逻辑来为空白结果提供默认值。通常在Access中,这种类型的逻辑是通过IIF完成的。

答案 1 :(得分:0)

这个(MSAccess / VBA)功能可以满足您的要求。如果你传入一个像mm / yyyy这样的字符串,它将返回一个像mm / 01 / yyyy这样的日期时间。但是,如果字符串不适合该模式(或等效),则函数将返回日期时间为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

答案 2 :(得分:0)

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

IIf(IsNull([YourDateFField]),#1/1/1970#,CDate([YourDateFField]))

这测试你的字段是否为空,如果是,则返回1/1/1970,否则它将你的日期字符串转换为实际日期(例如CDate(“04/2014”)将返回4/1/2014 )