在 Microsoft Access 中使用 SQL 语句忽略周末

Posted

技术标签:

【中文标题】在 Microsoft Access 中使用 SQL 语句忽略周末【英文标题】:Use SQL Statement to ignore weekends in Microsoft Acess 【发布时间】:2013-02-05 17:28:06 【问题描述】:

我找到了几个关于如何使用 SQL 语句忽略周末的主题。我不需要忽略假期,只是周末。但是,这些似乎都不适合我。我在 asp.net 中使用 Access 数据库并尝试使用此功能:

SELECT *
FROM your_table
WHERE ((DATEPART(dw, DateCalled) + @@DATEFIRST) % 7) NOT IN (0, 1)

但 AccessDataSource 似乎不喜欢这种语法。我的实际查询需要搜索 3 个工作日前的记录,这意味着如果星期五有记录,则要到下一个星期三才会显示。

【问题讨论】:

【参考方案1】:

您有一个日期/时间参数 DATEFIRST,并且您想要选择 DateCalled 值不晚于 DATEFIRST 前 3 个工作日的行时间>。我解释这意味着这些是您想要的每个参数值的最新日期...

DATEFIRST         3 workdays previous
---------------   -------------------
Mon, 01/28/2013   Wed, 01/23/2013
Tue, 01/29/2013   Thu, 01/24/2013
Wed, 01/30/2013   Fri, 01/25/2013
Thu, 01/31/2013   Mon, 01/28/2013
Fri, 02/01/2013   Tue, 01/29/2013
Sat, 02/02/2013   Tue, 01/29/2013
Sun, 02/03/2013   Tue, 01/29/2013

我使用 Access 2007 测试了以下查询。它返回与上述 DATEFIRST 模式匹配的结果。

PARAMETERS DATEFIRST DateTime;
SELECT *
FROM your_table AS y
WHERE y.DateCalled < DateAdd(
        'd',
        Switch(
            Weekday([DATEFIRST])=1,-4,
            Weekday([DATEFIRST])=2,-4,
            Weekday([DATEFIRST])=3,-4,
            Weekday([DATEFIRST])=4,-4,
            Weekday([DATEFIRST])=5,-2,
            Weekday([DATEFIRST])=6,-2,
            Weekday([DATEFIRST])=7,-3
            ),
        [DATEFIRST]
        );

根据您的 cmets,我怀疑我误解了您的意图。看来您不想要参数查询。相反,您希望 DateCalled 过滤器在查询运行日期前 3 天。如果是这样,请丢弃 PARAMETERS 子句并用 Access 的 Date() 函数替换 [DATEFIRST]

SELECT *
FROM your_table AS y
WHERE y.DateCalled < DateAdd(
        'd',
        Switch(
            Weekday(Date())=1,-4,
            Weekday(Date())=2,-4,
            Weekday(Date())=3,-4,
            Weekday(Date())=4,-4,
            Weekday(Date())=5,-2,
            Weekday(Date())=6,-2,
            Weekday(Date())=7,-3
            ),
        Date()
        );

【讨论】:

好的,是的,这就是我要找的!我遇到的唯一问题是,在尝试执行此查询时,我收到一条错误消息,指出“没有为一个或多个必需参数提供值” 将该 SQL 用作 Access 中的新查询。当您尝试运行它时,Access 将显示一个参数对话框,为每个缺失的参数请求一个值,并且该对话框将包含缺失参数的“名称”。 Access 认为参数是什么?如果您拼错了字段或表名称,Access 将找不到它,因此会断定它一定是一个参数。你有没有在d ('d') 周围加上引号? DateAdd 需要第一个参数的字符串值。 Access 弹出一个 DATEFIRST 对话框 但是 DATEFIRST 被设计为一个参数,这意味着您必须在运行查询时提供一个值。如果您实际上并不想要一个参数,那么您想要什么? 对不起,我需要一个网格视图来显示所有大于或等于 3 个工作日的记录,不包括周末。你上面的实际日期的例子就是我要找的。这能澄清什么吗?顺便说一句,感谢您的帮助!【参考方案2】:

你可以使用weekday:

SELECT *
FROM your_table
WHERE weekday(date) NOT IN (1, 7)

【讨论】:

除非您在访问中指定不同的星期日是一周的第一天,并且编号从 1 开始,因此您需要NOT IN (1, 7)WEEKDAY(date, 7) NOT IN (1, 2) 好的!该语法将正确找到所有记录!现在,我将如何搜索 3 天前的记录并忽略周末? @EricHickman,规则是每个“线程”cmets 一个问题不适用于新问题。对不起。 @EricHickman 在这里查看我的答案***.com/questions/13272320/… 以获取一些注释。 从技术上讲,这不是一个新问题。我已经说过这些是我在问题中的要求。

以上是关于在 Microsoft Access 中使用 SQL 语句忽略周末的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access 2007 - 查看报表中使用的查询?

在使用SQL Server后端的Microsoft Access中使用查找对话框时性能下降

在 Microsoft Access 中使用 Select 进行更新

在 Microsoft Access 2010 数据宏中使用变量数据

在 microsoft access 中使用组合框过滤表单结果

在 Python ODBC 中使用 Microsoft Access SQL 运算符