2

あるフィールド (日付) から月と日付を取得し、別のフィールド (DOB - 生年月日) から年を取得する式があります。

フィールドからのデータの例:

日付: 2003 年 1 月 2 日

生年月日: 1953 年 1 月 15 日

式:

Cancel Date: DatePart("m",[Date]) & "/" & DatePart("d",[Date]) & "/" & (DatePart("yyyy",[DOB])+60)

返されるもの: 1/2/2013

私の問題: DOB がその年の既存の DATE 記念日の後に発生した場合、キャンセル日は 1 年増加する必要があるため、上記の式は代わりに 2014 を返す必要があります。それを含めて、この式を単純化するにはどうすればよいですか? ありがとう!

4

2 に答える 2

2

このクエリはテストしていないため、必要なものを取得するには調整が必要になる場合があります。アイデアは、 m/d/部分Format()を単純化するために使用することです。次に、式を使用して、 に追加する年数を決定します。IIf()Year([DOB])

SELECT
    Format([Date], 'm/d/') & (Year([DOB])
        + IIf(DatePart('y', [DOB]) > DatePart('y', [Date]), 61, 60))
        AS [Cancel Date]
FROM YourTable;

そのアプローチは、 「年間通算日」DatePart('y', ...)を提供する に依存しています。たとえば、92 を返します。このメソッドを使用して、ある日付の月/日の部分を別の日付の月/日の部分と比較できます。月と日を別々にチェックするのを避けるためのショートカットのようなものです。DatePart("y", #2013-04-02#)

残念ながらDatePart('y', ...)うるう年は正しく考慮されていません。(以下のゴードのコメントを参照してください。)

于 2013-04-02T17:44:39.623 に答える
2

これがあなたが求めているものだと思います:

Cancel Date: DatePart("m", [Date]) & "/" & DatePart("d", [Date]) & "/" & (DatePart("yyyy", [DOB]) + IIf((DatePart("m", [DOB]) < DatePart("m", [Date])) Or (DatePart("m", [DOB]) = DatePart("m", [Date]) And DatePart("d", [DOB]) < DatePart("d", [Date])), 60, 61))

そのIIf()部分は本質的に言う

If (Month([DOB]) < Month([Date]))
        Or (Month([DOB]) = Month([Date]) And Day([DOB]) < Day([Date])) Then
    add 60
Else
    add 61
End If
于 2013-04-02T17:52:31.523 に答える