SQL平均仅工作日

时间:2019-06-07 07:35:30

标签: sql excel vba ms-access

我在MS Access中有一个数据表,

[DateID]   |[NameID]|[ValueID]
01/01/2019 |Ben     |5
01/01/2019 |Ace     |6
01/01/2019 |Ken     |7
01/01/2019 |Jon     |10
.
.
.
03/01/2019 |Ben     |8
03/01/2019 |Ken     |55
03/01/2019 |Jan     |52

一天中基本上有多个ValueID条目,名称不同,每天至少有100多个条目。

我需要绘制2个特定日期平日的平均ValueID,然后通过Excel VB执行sql代码。到目前为止,SQL代码无法区分工作日和周末。

到目前为止我可以使用的代码:SELECT AVG([ValueID]) FROM [TABLE] WHERE [DATEID] BETWEEN #10 Jan 2018# AND #15 Feb 2018#

已经搜寻了一下。我最近得到的是SELECT AVG([ValueID]) FROM [TABLE] WHERE ([DATEID] BETWEEN #10 Jan 2018# AND #15 Feb 2018#) AND DATENAME(WEEKDAY, [DATEID]) IN ('MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY')

但是,它给了我一个Undefined function 'DATENAME' in expression错误。如果我完全诚实,不知道我是否在使用此功能。

我知道我可以从技术上将日期范围导出到Excel工作表中,然后从中排除,但可能会导出1万多个数据点。因此,它更喜欢通过sql来完成,因为它看起来更干净。

2 个答案:

答案 0 :(得分:1)

您需要WeekdayNameWeekday,因此可以做到这一点:

...AND UCase(WeekdayName(Weekday([DATEID], 2))) NOT IN ('SATURDAY','SUNDAY')

也许您需要将2更改为1(或其他值)才能获得正确的日期名称(2代表星期一作为一周的开始)。

答案 1 :(得分:1)

从不使用文字,因为它们是本地化的,因此:

SELECT 
    AVG([ValueID]) 
FROM 
    [TABLE] 
WHERE 
    ([DATEID] BETWEEN #2018/01/10# AND #2018/01/15#) 
    AND 
    Weekday([DATEID], 2) < 6

函数 Weekday 中,参数2是 Monday 作为一周的第一天,然后6是 Saturday 。 / p>