过滤日期() - 1到日期(),日期之间的时间

时间:2014-07-29 17:38:53

标签: ms-access criteria

我想过滤今天和最后一天之间的日期和时间。我将使用它来查看两个用户之间的切断。

这是我得到的代码,我无法修复时间。我希望它是从昨晚6点到今天上午9点。

WHERE (((tbldtr.Date)=Date()-1) 
  AND (("time")>=#12/30/1899 18:0:0#)) 
  OR (((tbldtr.Date)=Date()) 
  AND (("time")<=#12/30/1899 9:0:0#))
ORDER BY tbldtr.Date;

1 个答案:

答案 0 :(得分:0)

这假设您的Date列是日期时间列,并且您没有单独存储时间。

WHERE tbldtr.Date >= dateadd("h", 18, dateadd("d", datediff("d", 0, now())-1, 0))
   and tbldtr.Date < dateadd("h", 9, dateadd("d", datediff("d", 0, now()), 0))

或者

WHERE tbldtr.Date  >= dateserial(year(now),month(now),day(now)-1) + 18/24
  AND tbldtr.Date < dateserial(year(now),month(now),day(now)) + 9/24

使用您认为更容易阅读的内容。

编辑:

我在即时窗口中进行了这样的测试

?#7/29/2014 7:00 PM#  >= dateserial(year(now),month(now),day(now)-1) + 18/24  AND #7/29/2014 7:00 PM# < dateserial(year(now),month(now),day(now)) + 9/24
True
?#7/29/2014 5:00 PM#  >= dateserial(year(now),month(now),day(now)-1) + 18/24  AND #7/29/2014 5:00 PM# < dateserial(year(now),month(now),day(now)) + 9/24
False
?#7/30/2014 7:00 PM#  >= dateserial(year(now),month(now),day(now)-1) + 18/24  AND #7/30/2014 7:00 PM# < dateserial(year(now),month(now),day(now)) + 9/24
False
?#7/30/2014 5:00 AM#  >= dateserial(year(now),month(now),day(now)-1) + 18/24  AND #7/30/2014 5:00 AM# < dateserial(year(now),month(now),day(now)) + 9/24
True

如果您的日期和时间列是分开的,您可以将它们添加到一起以生成单个日期时间值(并且因为在Access SQL中没有DateTime这样的数据类型我假设您有办法保持日期超出时间和时间。这不是最好的设计,但你必须有理由走这条路)

WHERE (tbldtr.Date + tbldtr.Time) >= dateadd("h", 18, dateadd("d", datediff("d", 0, now())-1, 0))
   and (tbldtr.Date + tbldtr.Time) < dateadd("h", 9, dateadd("d", datediff("d", 0, now()), 0))

或者

WHERE (tbldtr.Date + tbldtr.Time) >= dateserial(year(now),month(now),day(now)-1) + 18/24
  AND (tbldtr.Date + tbldtr.Time) < dateserial(year(now),month(now),day(now)) + 9/24

如果你想做一个完整性检查,你可以从你的时间中清除日期以防万一。

?tbldtr.Time - dateadd("d", datediff("d", 0, tbldtr.Time, 0),0)

以及日期之外的时间

?dateadd("d", datediff("d", 0, tbldtr.Date, 0),0))