SQL查询,找出数据集的最小值

时间:2018-04-29 19:04:56

标签: ms-access

SELECT MIN(DateDiff("yyyy",[Employment History].[Date of 1st Promotion],Employee.[Date of Birth])) AS MinimumPromotionAge 
FROM [Employee],[Employment History] 
WHERE(([Employee].[Promotion]="Yes") 
AND ((Employee.EmployeeID)=[Employment History].[EmployeeID]));

我创建此查询是为了找到最年轻的促销平均年龄,但使用的标点符号存在问题。想知道是否有任何建议可以帮助解决这个问题。

1 个答案:

答案 0 :(得分:0)

您可以使用别名来简化阅读:

SELECT 
    MIN(DateDiff("yyyy", E.[Date of 1st Promotion], E.[Date of Birth])) AS MinimumPromotionAge 
FROM 
    [Employee] As E,
    [Employment History] As EH
WHERE 
    E.Promotion = "Yes" 
    AND 
    E.EmployeeID = EH.EmployeeID;

但语法似乎是正确的,因此您必须更具体地说明错误。

此外, DateDiff 不会返回年龄,只会返回日历年的差异。

要计算年龄,请使用以下函数:

Public Function Years( _
  ByVal datDate1 As Date, _
  ByVal datDate2 As Date, _
  Optional ByVal booLinear As Boolean) _
  As Integer

' Returns the difference in full years between datDate1 and datDate2.
'
' Calculates correctly for:
'   negative differences
'   leap years
'   dates of 29. February
'   date/time values with embedded time values
'   negative date/time values (prior to 1899-12-29)
'
' Optionally returns negative counts rounded down to provide a
' linear sequence of year counts.
' For a given datDate1, if datDate2 is decreased step wise one year from
' returning a positive count to returning a negative count, one or two
' occurrences of count zero will be returned.
' If booLinear is False, the sequence will be:
'   3, 2, 1, 0,  0, -1, -2
' If booLinear is True, the sequence will be:
'   3, 2, 1, 0, -1, -2, -3
'
' If booLinear is False, reversing datDate1 and datDate2 will return
' results of same absolute Value, only the sign will change.
' This behaviour mimics that of Fix().
' If booLinear is True, reversing datDate1 and datDate2 will return
' results where the negative count is offset by -1.
' This behaviour mimics that of Int().

' DateAdd() is used for check for month end of February as it correctly
' returns Feb. 28. when adding a count of years to dates of Feb. 29.
' when the resulting year is a common year.
'
' 2000-11-03. Cactus Data ApS, CPH.
' 2000-12-16. Leap year correction modified to be symmetrical.
'             Calculation of intDaysDiff simplified.
'             Renamed from YearsDiff() to Years().
' 2000-12-18. Introduced cbytMonthDaysMax.
' 2007-06-22. Version 2. Complete rewrite.
'             Check for month end of February performed with DateAdd()
'             after idea of Markus G. Fischer.

  Dim intDiff   As Integer
  Dim intSign   As Integer
  Dim intYears  As Integer

  ' Find difference in calendar years.
  intYears = DateDiff("yyyy", datDate1, datDate2)
  ' For positive resp. negative intervals, check if the second date
  ' falls before, on, or after the crossing date for a full 12 months period
  ' while at the same time correcting for February 29. of leap years.
  If DateDiff("d", datDate1, datDate2) > 0 Then
    intSign = Sgn(DateDiff("d", DateAdd("yyyy", intYears, datDate1), datDate2))
    intDiff = Abs(intSign < 0)
  Else
    intSign = Sgn(DateDiff("d", DateAdd("yyyy", -intYears, datDate2), datDate1))
    If intSign <> 0 Then
      ' Offset negative count of years to continuous sequence if requested.
      intDiff = Abs(booLinear)
    End If
    intDiff = intDiff - Abs(intSign < 0)
  End If

  ' Return count of years as count of full 12 months periods.
  Years = intYears - intDiff

End Function

,在查询中:

SELECT 
    MIN(Years(E.[Date of Birth]), E.[Date of 1st Promotion]) AS MinimumPromotionAge 
FROM
<snip>