我有一大堆使用手动输入的访问查询。 I.E.当查询运行时,会弹出一个类似START-DATE的内容,然后弹出另一个END-DATE。
数据库标准是:
between [START-DATE] AND [END-DATE]
开始日期和结束日期始终是上个月的第一天和上个月的最后一天。
我想用计算版本替换标准,因此不需要输入,但列定义为6个字符,格式为YYMMDD。
我已经陷入困境,过度思考这个问题,例如
"如果当前月份是1月份呢?" 或者"我如何处理30/31/29天的月份?"
使用Access条件是否有一个简单的解决方案?
任何帮助总是受到赞赏!
答案 0 :(得分:0)
我将要使用的逻辑如下:
Date()
获取当前日期。DateSerial
将其作为当月的第一天。当月的第一天:DateSerial(Year(Date), Month(Date), 1)
上个月的第一天:DateAdd('m', -1, DateSerial(Year(Date), Month(Date), 1))
上个月的最后一天:DateAdd('d', -1, DateSerial(Year(Date), Month(Date), 1))
现在,您可以将其格式化为字符串,并比较字符串,但更好的方法是将该列强制转换为日期(除非您有索引,否则将这些日期格式化为字符串会更快) :
DateSerial(Left(MyColumn, 2), Mid(MyColumn, 3, 2), Right(MyColumn, 2))
Between
DateAdd('m', -1, DateSerial(Year(Date()), Month(Date()), 1))
And DateAdd('d', -1, DateSerial(Year(Date()), Month(Date()), 1))
这应该处理你投掷的任何事情:闰年,1月,短月等等。
答案 1 :(得分:0)
在条件中使用Like
:
Like Format(Date(), "YYMM") & "*"
上个月,请将Date()
替换为Date()-Day(Date())
答案 2 :(得分:0)
DateSerial和一点点数学会做到:
FirstDayPreviousMonth: DateSerial(Year(Date()), Month(Date()) - 1, 1)
LastDayPreviousMonth: DateSerial(Year(Date()), Month(Date()), 0)
因此,如果您的日期字段是DateTime:
Between DateSerial(Year(Date()), Month(Date()) - 1, 1) And DateSerial(Year(Date()), Month(Date()), 0)
如果你是
6个字符,格式为YYMMDD
表示该字段包含Text,您应该更改它。始终将日期作为真实日期值处理。如果它只是字段的格式,那没关系。
对于文本字段,只需格式化日期值:
Between Format(DateSerial(Year(Date()), Month(Date()) - 1, 1), "\'yymmdd\'") And Format(DateSerial(Year(Date()), Month(Date()), 0), "\'yymmdd\'")
或使用Patrick的方法:
Like Format(DateAdd('m', -1, Date()), "\'yymm*\'")
答案 3 :(得分:0)
我的解决方案是三个响应中的两个的组合,因为它们中的每一个都没有返回所需的结果:
Like Left(Format(DateSerial(Year(Date()),Month(Date())-1,1),"yymmdd"),2) & Format(DateAdd('m',-1,Date()),"mm") & "*"
这适用于所有月份,并返回上个月的所有日期
Eric的解决方案也很不错,当我将其修改为包含格式时,它也给了我想要的结果,并且也适用于所有月份。
Between Format(DateAdd('m',-1,DateSerial(Year(Date()),Month(Date()),1)),"yymmdd") And Format(DateAdd('d',-1,DateSerial(Year(Date()),Month(Date()),1)),"yymmdd")