如何在MS ACCESS中一起使用MIN,IFF和Datepart功能?

时间:2013-04-03 11:19:38

标签: sql ms-access datepart

我有一个如下表格,我想根据日期将日期时间条目分组,没有时间和班次,例如,早班时间从早上5点开始,到14点结束。在这里,MAX函数找到正确的日期,你能帮我看看MIN函数有什么问题吗?

    Indate                Incondition
    ---------             -----------
    25.01.2013 05:00:38    KT-RING
    25.01.2013 05:21:52    KT-EMPTY
    25.01.2013 05:22:00    KT-PROCESS
    25.01.2013 06:10:50    KT-RING
    25.01.2013 16:10:50    KT-EMPTY
    26.01.2013 06:10:50    KT-RING

    SELECT  Int(Indate) AS DATE,  
    Min( IIf( ( DatePart('h',[Indate])>=05 AND DatePart('h', [Indate])<13), Indate, 0)) AS FRUHRINGMIN,
    Max(IIf((DatePart('h',Indate)>=05 And
    DatePart('h',Indate)<13), Indate,0)) AS FRUHRINGMAX 
FROM  TABLE WHERE Incondition= 'KT-RING' 
    GROUP BY Int(Indate);

    RESULT:
    DATE      FRUHRINGMIN     FRUHRINGMAX
    -----     -------------   -----------
   25.01.2013  00:00:00       25.01.2013 06:10:50 
   26.01.2013  00:00:00       26.01.2013 06:10:50       

1 个答案:

答案 0 :(得分:2)

我将示例数据保存在Access 2007数据库的表中。但是当我尝试运行您的查询时,Access引发了有关别名DATE的错误,这是一个保留字。包围该别名允许查询无错误地运行。

SELECT
    Int(Indate) AS [DATE],  
    Min(IIf((DatePart('h',[Indate])>=05 AND DatePart('h', [Indate])<13), Indate, 0)) AS FRUHRINGMIN,
    Max(IIf((DatePart('h',Indate)>=05 And DatePart('h',Indate)<13), Indate,0)) AS FRUHRINGMAX 
FROM tblJeanneQuadel
WHERE Incondition= 'KT-RING' 
GROUP BY Int(Indate);

然而,它给我的结果与你报道的结果不符。

DATE  FRUHRINGMIN           FRUHRINGMAX
41299 1/25/2013 5:00:38 AM  1/25/2013 6:10:50 AM
41300 1/26/2013 6:10:50 AM  1/26/2013 6:10:50 AM

请注意我的日期/时间值采用美国格式,但它们实际上基于与您相同的值,只是以不同的方式显示。

我不明白为什么你的查询结果将第一列显示为日期而不是像我的那样显示长整数,我期望从Int(Indate)得到结果。但那是一个小问题;如果需要,我们可以从一个转换为另一个。

更重要的是,我不确定实际发生了什么。如果包围[DATE]不允许您的查询运行并产生正确的结果,请尝试将IIf()条件移至WHERE子句中。这会大大简化您的Min()Max()表达式。但是,如果仍然没有产生您想要的结果,请告诉我们它返回的内容以及您想要返回的内容。