0

SQLServer2000の使用

表1

Id    date 
---   ----------
001   23/01/2012
002   25/01/2012
003 
004   01/02/2012

からtable1、表示したいのですがid、日付がnullであるか、日付が現在の月と同じです。

調子

  • たとえば、現在の月は02/2012意味です。003の日付はnullであるため、ID 003と004を表示したいのですが、004の日付は現在の月の日付と同じです。

  • 現在の月がの場合03/2012、004の日付は表示されません

SQL Serverでこれを行う方法は?

期待される出力

Id     date 
003 
004    01/02/2012
4

5 に答える 5

2

日付列のインデックスを使用できるように、クエリを引数可能にすることが重要です。したがって、関数(日付)(関数は年、月、または日付部分)の形式のwhere句は、SQL Serverが日付のインデックスを使用できないため、不適切です。

代わりに、クエリをフレーム化して、次の形式にする必要があります

select *
from table1
where (date is null) or (date between [STARTOFMONTH] and [ENDOFMONTH])

DateTime列には、その名前が示すように、TIMEコンポーネントがあります。したがって、月末の真夜中までにしたいので、その間は注意が必要ですが、翌月につながる真夜中ではありません...月末から3ミリ秒を引くことで、これを回避しようとする人もいます。それは悪いことであり、将来の保証ではありません。

クエリを次のように表示することをお勧めします

select *
from table1
where (date is null) or ( (date >= [STARTOFMONTH] and date < [STARTOFNEXTMONTH]) )

それらの値を取得する方法(そしてSQL 2000と互換性がある...)?頭のてっぺんから離れた1つの方法は

cast(  floor( cast(dateAdd(d, -1 * day(getDate()) + 1, getDate()) as float ) ) as datetime )

翌月の開始は、それに1か月を加算することによって取得されます。これにより、現在の日付が取得され、現在の月に経過した日数が差し引かれ、1が加算されます。次に、月の最初の日に等しい日付/時刻がありますが、時間コンポーネントがあります。フロート、フロア、そして日時にキャストバックするキャストはそれを修正します。

これはスカラーまたはインラインテーブルUDFに入れることができますが、簡潔にするために(すでに長い答えです!)、where句は

select *
from table1
where 
(date is null)
OR
(
  ( date >= cast(  floor( cast(dateAdd(d, -1 * day(getDate()) + 1, getDate()) as float ) ) as datetime ) )
  AND
  ( date < dateAdd(d, 1, cast(  floor( cast(dateAdd(d, -1 * day(getDate()) + 1, getDate()) as float ) ) as datetime ) ) )
)

お役に立てば幸いです。

于 2012-06-11T08:24:04.697 に答える
0
Select * 
from table1 
where date is null or datepart(mm,getdate()) = datepart(mm,date)
于 2012-06-11T05:38:32.183 に答える
0
SELECT * FROM Table1 
WHERE (1=1)
AND
(
    MONTH(CURRENT_TIMESTAMP) = MONTH([date])
    AND
    YEAR(CURRENT_TIMESTAMP) = YEAR([date])
)
OR
(
    [date] IS NULL
)
于 2012-06-11T05:39:42.027 に答える
0

nullYear、Month関数を使用して確認できます

select  Id
from Table1 
where date is null or (YEAR(GETDATE()) == Year(date) and Month(GETDATE()) == Month(date))
于 2012-06-11T05:43:44.757 に答える
0

この方法を試してください:-

SELECT *
FROM table1
WHERE date IS NULL OR (Year(currentDate) = Year(date) AND Month(currentDate) = Month(date))
于 2012-06-11T05:44:23.447 に答える