1

多くの日付のレコードを含むテーブルがあります。日付の月の最終日に該当するレコードのみを返すクエリを実行したいと考えています。何かのようなもの:

SELECT * FROM mytable
WHERE DATEPART(d, mytable.rdate) = DATEPART(d,DATEADD(m,1,DATEADD(d, -1, mytable.rdate)))

が正しい比較を返すrdateためには、引数の右側にある がその月の最終日でなければならないため、これは機能しません。dateadd

基本的に、この比較を行う簡潔な方法はありますか? 四半期末に相当するものも非常に役立ちますが、間違いなくもっと複雑です。

編集:

基本的に、特定の日付が該当する月 (または四半期) の最後の日付であるかどうかを確認したいと考えています。そうであれば、そのレコードを返します。これには、任意の日付の月の最後の日を返す関数が含まれます。例lastdayofmonth('2013-06-10') = 30(したがって、このレコードは返されません。

EDIT2:

四半期の最終日に該当するレコードを返す場合は、次のようにする必要があります。

SELECT * FROM mytable
WHERE DATEPART('d', mytable.rdate) = lastdayofmonth(mytable.rdate)
  AND DATEPART('m', mytable.rdate) = lastmonthofquarter(mytable.rdate);

トリッキーなビットはlastdayofmonth()andlastmonthofquarter()関数です

4

3 に答える 3

2

DateSerial 関数を使用して、特定の日付の月の最終日を計算します。

3 番目の引数dayとしてゼロを渡すと、実際には前月の最後の日付が返されます。

rdate = #2013-7-24#
? DateSerial(Year(rdate), Month(rdate), 0)
6/30/2013 

その月の最後の日付を取得するには、の引数rdateに追加1します。

? DateSerial(Year(rdate), Month(rdate) + 1, 0)
7/31/2013 

13 を返すため、このアプローチは Decemberrdateで壊れるのではないかと疑うかもしれません。Month() + 1DateSerial

rdate = #2013-12-1#
? DateSerial(Year(rdate), Month(rdate) + 1, 0)
12/31/2013 

Access アプリケーション セッション内からクエリを実行する場合は、そのアプローチに基づいて VBA 関数を作成し、クエリでカスタム関数を使用できます。

ただし、クエリが ODBC または OleDb 接続から Access データベースに実行される場合、クエリは VBA ユーザー定義関数を使用できません。そのような状況でDateSerialは、クエリで直接使用できます。

SELECT m.*
FROM mytable AS m
WHERE m.rdate = DateSerial(Year(m.rdate), Month(m.rdate) + 1, 0)

rdateすべての値に時間コンポーネントとして真夜中が含まれている場合、これは機能するはずです。これらの値に他の時間が含まれる場合は、 を使用しますDateValue

WHERE DateValue(m.rdate) = DateSerial(Year(m.rdate), Month(m.rdate) + 1, 0)
于 2013-07-24T14:49:15.717 に答える
1

これを試してみてください。これは次でテストされていMS Accessます:

使用String Concatenation:

SELECT * FROM mytable
WHERE 
DatePart('d',mytable.rdate) = 
DatePart('d',dateadd('m',1, "1/" & DatePart('m',mytable.rdate)  & "/" & DatePart('yyyy',mytable.rdate))-1);

を使用せずに更新string concatenation:

SELECT * FROM
(SELECT *,
DATEPART('d',DATEDIFF('m',0,mytable.rdate)+1,
DATEADD('m',1,
DATEADD('d',DATEDIFF('d',0,mytable.rdate)- DATEPART('d',mytable.rdate)+1,0))-1) as EOMonth
FROM mytable ) A
WHERE DATEPART('d',mytable.rdate) = DATEPART('d',EOMonth)
于 2013-07-24T10:25:14.090 に答える