Access 365:在查询中找到最早的日期

时间:2018-10-26 10:34:55

标签: ms-access access-vba

我在对表格进行规范化方面犯了一些错误。现在我的桌子看起来像这样:

ID    Date1         Date2          Date 3
----------------------------------------------
1     2014-01-02    2015-01-02
2     2014-01-02                   2015-01-03
...

我认为我可以在查询中使用IIF函数,并且可以比较那些日期并返回最小值。问题是,有返回的NULL值使该函数一文不值。

所以我的问题是:由于NULL值,如何在查询中返回三个中的最小值而不出现错误结果?

2 个答案:

答案 0 :(得分:1)

SQL Min聚合函数将为您提供所需的内容,但首先必须将这些日期值放入一列中。为此,请使用UNION查询。

SELECT sub.ID, Min(sub.Date_field) AS MinOfDate_field
FROM
    (
        SELECT y1.ID, y1.Date1 AS Date_field
        FROM [YourTable] AS y1
        UNION ALL
        SELECT y2.ID, y2.Date2 AS Date_field
        FROM [YourTable] AS y2
        UNION ALL
        SELECT y3.ID, y3.Date3 AS Date_field
        FROM [YourTable] AS y3
    ) AS sub
GROUP BY sub.ID;

如果最终查询中还需要其他YourTable字段,请将INNER JOIN该查询添加到表中。

答案 1 :(得分:0)

您可以使用Iif,但您也必须注意NULL值。

因此,使用Date1代替Nz(Date1, CDate("31.12.9999")),以此类推。

或者,您可以在查询中使用以下MinDate过程:

SELECT MinDate([Date1],[Date2],[Date3]) AS MinDate FROM Table1

Public Function MinDate(ParamArray values() As Variant) As Date
    Dim value As Variant
    For Each value In values: Do
        If VarType(value) <> vbDate Then Exit Do
        If CLng(MinDate) = 0 Then
            MinDate = value
        Else
            If value < MinDate Then MinDate = value
        End If
    Loop While False: Next value
End Function

但是两种方法肯定都能闻到... 您应该考虑重新设计。

相关问题