2

我正在尝试在 MS Access 选择查询中使用 DatePart() 从最初采用字符串形式的日期中提取月份和年份(作为数字)


“YYYY-MM-DD HH:NN:SS.0000000”


别人写的初始代码说:

DatePart("m", date)
DatePart("yyyy", date)

但这导致查询运行时出现“数据类型,条件不匹配”错误,因此我尝试使用 Cdate() 将字符串转换为日期类型。

DatePart("m", Cdate(date))
DatePart("yyyy", Cdate(date))

然而这并没有解决问题。我想知道我的初始日期字符串是否不是 Cdate() 可以转换的形式,或者是否有更简单的方法可以从我的日期字符串中提取部分数字日期。

如果这个问题不完整,我准备进一步详细说明情况,但我不希望超越自己。

4

2 回答 2

1

那些多余的零会是个问题,去掉它们,你可以说

CDate(Mid(sdate, 1, InStr(sdate, ".") - 1))

然后

DatePart("m", CDate(Mid(sdate, 1, InStr(sdate, ".") - 1)))

但是,您可能会发现只引用字符串的适当部分会更方便:

aYr = Left(sdate,4)
aMnth = Mid(sdate,6,2)
于 2013-02-13T22:49:25.760 回答
1

你是对的,小数秒阻止CDate接受你的字符串。你可以去掉小数秒。但是由于您最终需要年份和月份,您可以忽略所有时间组件而只使用日期部分。

查看此即时窗口会话是否提供任何有用的信息。

MyString = Format(Now(), "yyyy-mm-dd hh:nn:ss") & ".0000000"
? MyString
2013-02-14 23:38:09.0000000
' if date format is always yyyy-mm-dd,
' give CDate the first 10 characters
? CDate(Left(MyString, 10))
2/14/2013 
' year
? DatePart("yyyy", CDate(Left(MyString, 10)))
 2013 
' or
? Year(Left(MyString, 10))
 2013 
' month
? DatePart("m", CDate(Left(MyString, 10)))
 2 
' or
? Month(CDate(Left(MyString, 10)))
 2 

' if date format can vary slightly, eg yyyy-m-d,
' give CDate everything before the first space
? CDate(Left(MyString, InStr(MyString, Chr(32)) -1))
2/14/2013 
? Year(CDate(Left(MyString, InStr(MyString, Chr(32)) -1)))
 2013 
? Month(CDate(Left(MyString, InStr(MyString, Chr(32)) -1)))
 2 

您没有提到在获得年份和日期数字后您将如何处理它们。如果您打算将它们作为字符串连接在一起,您可以使用Format().

? Format(Left(MyString, 10), "yyyymm")
201302
于 2013-02-15T07:00:55.447 回答