0

わかりました、これができるはずだと思いますが、無駄に検索しました。

今日が何曜日であるかに応じて、2 つの異なるデータ セットのいずれかを表示する必要があります。具体的には、今日が 10 月 31 日 (またはそれ以前) の場合、昨年の 10 月 1 日から今年の終わりまでのすべてのエントリをプルしたいと考えています。今日が 10 月 31 日より後の場合、データ セットに今年の 10 月 1 日から翌年末までのエントリが表示されるようにします。

以下のコードは、特定のデータセットに存在するすべての月を格納する単純な「カレンダー」テーブル変数を作成しています。現在、私はそれを今年の日付に限定しています。上記のように機能できるように、それをコードに置き換えたいと思います。IF文を使おうと思ったのですが、getdate()で日と月だけ比較する方法がわかりません。

DECLARE @calendar TABLE 
(       mon_name    VARCHAR(10)
    ,   mon_number  INT
    ,   yr          INT
)

INSERT INTO @calendar
SELECT      DATENAME(m,departure_date)
        ,   MONTH(departure_date)
        ,   YEAR(departure_date)
FROM        trip_mission
WHERE       departure_date          <>'1/1/1900' 
AND         YEAR(departure_date)    = YEAR(getdate())
GROUP BY    DATENAME(m,departure_date)
        ,   MONTH(departure_date)
        ,   YEAR(departure_date)

質問の単純化された形式は、今日が <= 10 月 31 日である場合にのみコードを実行するにはどうすればよいかということかもしれません。毎年ひっくり返る。

4

2 に答える 2

1

次の小さなトリックを使用すると、月に基づいてさまざまなサブセットを選択できます。

WHERE departure_date >= DATEADD(
  YEAR,
  MONTH(GETDATE()) / 11 - 1,
  CAST(YEAR(GETDATE()) AS char(4)) + '1001'
)

最後の引数は、今年の 10 月 1 日の日付を形成します。2 番目の引数は、1 年を減算するかどうかを制御します。現在の年が 2012 年であると仮定すると、現在の月に応じて得られる結果は次のとおりです。

Current month  MONTH(GETDATE())  MONTH(…) / 11  MONTH(…) / 11 - 1  DATEADD(…)
-------------  ----------------  -------------  -----------------  ----------
January        1                 0              -1                 2011-10-01
February       2                 0              -1                 2011-10-01
March          3                 0              -1                 2011-10-01
April          4                 0              -1                 2011-10-01
May            5                 0              -1                 2011-10-01
June           6                 0              -1                 2011-10-01
July           7                 0              -1                 2011-10-01
August         8                 0              -1                 2011-10-01
September      9                 0              -1                 2011-10-01
October        10                0              -1                 2011-10-01
November       11                1              0                  2012-10-01
December       12                1              0                  2012-10-01
于 2012-05-02T11:29:55.213 に答える
1

クエリは、今年のレコードのみをフィルター処理し、CASE 式を使用して、出発日が11 月12 月の場合は値1を割り当て、それ以外の月の場合は0を割り当てます。同じロジックを使用して、今日の日付を割り当てます。次に、両方の CASE 式の値が比較され、一致するレコードがフェッチされます。

たとえば、10 月31 日から3 月 31日など、別の月に切り替えたい場合は、 CASE 式の値10を03に変更する必要があります。

SQL Fiddle でデモを表示するには、ここをクリックしてください。

スクリプト:

CREATE TABLE trip_mission 
(
    departure_date  DATETIME NOT NULL
);

INSERT INTO trip_mission (departure_date) VALUES
    ('2012-04-30'),
    ('2011-01-01'),
    ('2012-01-30'),
    ('2012-04-30'),
    ('2013-01-01'),
    ('2012-11-01'),
    ('2012-12-01'),
    ('2012-11-12'),
    ('1900-01-01'),
    ('2012-10-31');

SELECT  departure_date
FROM    trip_mission tm
WHERE   YEAR(departure_date)    = YEAR(GETDATE()) 
AND     (CASE WHEN MONTH(departure_date) > 10 THEN 1 ELSE 0 END) =
        (CASE WHEN MONTH(GETDATE())      > 10 THEN 1 ELSE 0 END)

出力:

DEPARTURE_DATE
-----------------------
2012-04-30 00:00:00.000
2012-01-30 00:00:00.000
2012-04-30 00:00:00.000
2012-10-31 00:00:00.000
于 2012-05-02T00:45:00.310 に答える