去年の4月4日(今日から)から4年を引いた日に戻って、その日付を返すにはどうすればよいですか?
今日の日付が今年の4月4日より前か後かを確認することから始めて、そこから進むこともできますが、この問題に対するさまざまなアプローチを見てみたいと思います。
これはより大きなselectステートメントの一部になるため、自己完結型のSELECTまたは関数が最適なソリューションになります。
ありがとう!
去年の4月4日(今日から)から4年を引いた日に戻って、その日付を返すにはどうすればよいですか?
今日の日付が今年の4月4日より前か後かを確認することから始めて、そこから進むこともできますが、この問題に対するさまざまなアプローチを見てみたいと思います。
これはより大きなselectステートメントの一部になるため、自己完結型のSELECTまたは関数が最適なソリューションになります。
ありがとう!
私はこれを行うためのきちんとした方法を見つけることができません-私は通常、日付の計算を行うために私の試した真のDATEADD/DATEDIFF
ペアに頼りますが、私たちが1年を通してどれだけきちんと進んでいるかを考慮する方法を考えることはできません-だから次のCASE
式も取得します。
select DATEADD(year,
DATEDIFF(year,'20010101',CURRENT_TIMESTAMP)
- CASE WHEN DATEPART(month,CURRENT_TIMESTAMP) IN (1,2,3) THEN 1
WHEN DATEPART(month,CURRENT_TIMESTAMP) = 4 AND
DATEPART(day,CURRENT_TIMESTAMP) < 4 THEN 1
ELSE 0 END
,'19970404')
特定の日付をテストしてエッジの状態を確認するには:
declare @dt datetime
set @dt = '20120403'
select DATEADD(year,
DATEDIFF(year,'20010101',@dt)
- CASE WHEN DATEPART(month,@dt) IN (1,2,3) THEN 1
WHEN DATEPART(month,@dt) = 4 AND
DATEPART(day,@dt) < 4 THEN 1
ELSE 0 END
,'19970404')
今年の4年前に今年の4月4日が必要な場合は、
DATEADD(year, DATEDIFF(year, '20010101', @dt), '19970404')
十分であろう。
私は次のようなものを使用します:
SELECT CASE
WHEN SIGN(DATEDIFF(DAYOFYEAR, GETDATE(), STR(DATEPART(YY, GETDATE())) + '-04-04')) = 1
THEN DATEADD(YY, -4, STR(DATEPART(YY, GETDATE()) - 1) + '-04-04')
ELSE DATEADD(YY, -4, STR(DATEPART(YY, GETDATE())) + '-04-04')
END;
編集:
これは、4月4日と今日の差が正(「4/4は今年後半になる」)またはゼロ/負(「4/4は今日または今日より前」)であるかどうかをチェックし、に従って日付を返しますそのチェック。
このようなものはどうですか
declare @date datetime = getdate()
select dateadd(day, 3, dateadd(month, 3, dateadd(year, datediff(year, 0, @date)-4, 0)))