【问题标题】:Data Conversion with DatePart in an MS access select query在 MS 访问选择查询中使用 DatePart 进行数据转换
【发布时间】:2013-02-13 22:36:52
【问题描述】:

我正在尝试在 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() 可以转换的形式,或者是否有更简单的方法可以从我的日期字符串中提取部分数字日期。

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

【问题讨论】:

    标签: select ms-access-2007 insert-into


    【解决方案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)
    

    【讨论】:

    • 抱歉忘记回复...这确实消除了我遇到的类型不匹配错误。非常感谢。
    【解决方案2】:

    你是对的,小数秒阻止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
    

    【讨论】:

    • 感谢您的回复,这也是有用的信息。基本上问题已经解决了:DatePart() 需要一个日期类型的参数,而 CDate() 需要一个没有尾随小数秒部分的字符串参数。
    • 那么您是说从字符串中提取日期值时,您更喜欢CDate(Mid(YourString, 1, InStr(YourString, ".") - 1)) 而不是CDate(Left(YourString, 10))? 3 个函数而不是 2 个?
    • 不,在这种情况下调用 Left() 效率更高,我同意。但是,省略可变数量的小数秒的概念通常可能更有用。他的及时回答也给了我很大的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多