2016-05-11 10 views
3

日付が1年の第1月と第29月の第7月の間であるかどうかを確認する必要があります。 日付から月の日を抽出し、それを0101と0729の間で比較する(または日付がdd mmが629より小さいかどうかを調べる)ハッピーソリューションの種類を確認する前に、どの日付もparticalr日と月との間にあり、その年の不変である。日付は1年1番目から7月29日のいずれかの年(Sql Server 2008+)

他の賢明抽出月と日の日付から、いくつかハックarithmaticを行うのは簡単ですが、私は私の後に来る貧しいプログラマのためのより良いコードを残すようにしたいと、なぜ地獄は、いくつかの気紛れ作ら推測する必要がありません私はそれがより長くかかる場合でも明示的である。 DateField1を想定し

+1

日付は単一の列に含まれていますか? 'BETWEEN'を使わないのはなぜですか? –

+0

@TimBiegeleisen:何と何の間?どの年でもかまいません – Arjang

+0

[link](https://technet.microsoft.com/en-us/library/ms186724(v = sql.110).aspx)のドキュメントからは、書面よりも優れた解決策は存在しないようです'MONTH(datecolumn)<7または(MONTH(datecolumn)= 7およびDAY(datecolumn)<29)'(7月29日を含める場合は30)です。 – StephaneM

答えて

1

別のオプション:

DECLARE @TheDate date = '2016-07-29'; 

SELECT 1 
WHERE DATEADD(Year, -(YEAR(@TheDate) - 2000), @TheDate) 
    BETWEEN '2000-01-01' AND '2000-07-29' 
(saleDateは時間成分を有する)2000年5月にすべての販売を得るために、
1
Select * from TableWithNoName where DateField1 between DATETIMEFROMPARTS(YEAR(DateField1),1, 1, 0, 0, 0, 0) and DATETIMEFROMPARTS(YEAR(DateField1),7, 29, 23, 59, 59, 999) 

EDIT

+0

これは質問ではなく、答えの一部でなければなりません。 –

+0

@ ZoharPeled:なぜですか?それは私がaswersを得た後に使用を終えたものなので、実際には答えです。 – Arjang

+1

2008年にはこれがうまくいかず、たとえそうであったとしても、BDateが時間のない日付値であっても、誤った結果を返す可能性があります。 –

1
where datetimeField < dateFromParts(year(dateTimeField), 7, 30) 

日付値である:上記は2012年に仕事以降でしょう。

where datetimeField < CAST(CAST(year(dateTimeField) AS CHAR(4))+'0730' AS DATE); 

またはビットを簡素化:

where datetimeField < CAST(year(dateTimeField) AS CHAR(4))+'0730'; 

PS:BETWEENを使用して、共通の落とし穴(Xのような役割を果たし> 2008のためには、開発者のための「非常にシンプル」であるいくつかの算術演算を行うことができます= v1およびx < = v2)は、日付部分のフィールドに時間部分が含まれている可能性がありますが、示唆されておらず、正確なレコードを正確に取得するのに役立ちません(終了時刻を指定する方法がないため)。代わりに、常にx> = v1とx < v2スタイルを使用する必要があります。ここで、v2は最小の排他的な上限値です。すなわち:

saleDate >= '20000501' and saleDate < '20000601' 

ないで:

saleDate between '20000501' and '20000531' 

かどうか:

saleDate >= '20000501' and saleDate <= '20000531' 
+0

私のプラス1を取ってください!しかし、これはまさに私が避けようとしていたものです。開発者にとってシンプルなことは、クリーンで、vodoo aritmaticでなく、文字列で回り込むことではありません:) – Arjang

+1

きれいです。あなたの懸念が文字列を使用している場合は、より長いルートに移動して、month(dateTimeField)<7または(month(dateTimeField)= 7およびday(dateTimeField)<30) –

関連する問題