2017-03-21 2 views
-1

いくつかの不良データを修正するためのクエリを作成しています。私たちは "DueDate"という日付を持っており、毎月その日付に1ヶ月追加します。 1/30は2/28になり、その後は3/28、4/28になります。SQLで月を追加し、範囲内で一番低い日を保持

x日を元のDueDateに追加できるクエリを作成しようとしていますが、毎月個別に繰り返しているように扱います。したがって、実際には1/30 + 2ヶ月は3月28日でなければなりません。なぜなら、2月を通過しなければならないからです。

データセット全体を1回の更新で計算して、きれいでシンプルに保ちたいと思っています。 > 3/28(それは2月28日を通過し、最大戻ったことがないので)

5/31 5ヶ月 - 私はそれが

1/30 2ヶ月を計算する方法の

例 - > 10/30(それは6月30日を通過し、決してアップ戻っていないので)SQL Serverで

+0

RDMSにタグを付けてください。 –

+1

質問が明確でないため、入力例と出力例を入力する必要があります。 – Hogan

+0

RDMSとは何ですか? – user5655541

答えて

0

:その日は各月に発生した最新の日付を取得するにはカレンダーテーブルとcount() over()を使用して

declare @FromDate date = '20160130'; 
declare @ThruDate date = '20161231'; 
set @FromDate = dateadd(month,datediff(month,0,@FromDate),0); 
/* Calendar Table substitue for demo*/ 
;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n)) 
, d as (
    select DateValue=convert(date,dateadd(day 
     , row_number() over (order by (select 1)) -1, @fromdate)) 
    from   n as deka cross join n as hecto 
    cross join n as kilo cross join n as [10k] 
) 
, cal as (
    select top (datediff(day, @FromDate, @ThruDate)+1) 
     [Date] = DateValue 
    , [Day] = convert(tinyint,datepart(day,DateValue)) 
    from d 
    order by DateValue 
) 
/* query */ 
select top 1 [date] 
from (
    select *, count(*) over (partition by day) as dm_count 
    from cal 
) s 
where dm_count = datediff(month,@fromdate,@thrudate)+1 
order by [date] desc 

rextesterデモ:http://rextester.com/TZROKS25405

リターン:

+------------+ 
| date | 
+------------+ 
| 2016-12-29 | 
+------------+ 

注:2016年はうるう年だったので、29日は2月にありました。テーブルが参照

カレンダーと番号:

関連する問題