2017-08-18 4 views
0

私は支払スケジュール表を持っており、すべての口座に対して1口座前に移動したいと思います。それは15と(2月のための30か28か29)のためにだけ循環する。口座番号でのSQL移動日程

accountno | inst_no | date(datetime) | amount 
0001  | 1  | 8-15-2017  | 100 
0001  | 2  | 8-30-2017  | 100 
0001  | 3  | 9-15-2017  | 100 
--------------------------------------------- 
0002  | 1  | 6-15-2017  | 100 
0002  | 2  | 6-30-2017  | 100 
0002  | 3  | 7-15-2017  | 100 
-------------------------------------------- 
0003  | 1  | 8-15-2017  | 100 
0003  | 2  | 8-30-2017  | 100 

結果は

accountno | inst_no | date(datetime) | amount 
0001  | 1  | 8-30-2017  | 100 
0001  | 2  | 9-15-2017  | 100 
0001  | 3  | 9-30-2017  | 100 
--------------------------------------------- 
0002  | 1  | 6-30-2017  | 100 
0002  | 2  | 7-15-2017  | 100 
0002  | 3  | 7-30-2017  | 100 
-------------------------------------------- 
0003  | 1  | 8-30-2017  | 100 
0003  | 2  | 9-15-2017  | 100 

これは、クエリで行うことができますか?

+0

使用しているデータベースで質問にタグを付けてください。 –

+0

「日付1」とはどういう意味ですか? – Richard

+0

私はスケジュールを1日前に移動することを意味します。 8-15-2017のようになりましたら、クエリを実行した後に8-30-2017になるはずです –

答えて

0

これはどうですか? SELECTに簡単に書き換えることができます。

UPDATE PaymentScheduleTable 
SET d = CASE WHEN DAY(d) = 15 
      THEN 
       CASE WHEN MONTH(d) = 2 
        THEN DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,d)+1,0)) -- last day of month 
        ELSE DATEADD(DAY, 15, d) 
       END 
       ELSE DATEADD(DAY, 15, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,d)+1,0))) 
     END 
0

私はRadimの答えを修正し、この解決策を思いついた。

(CASE 
       WHEN DAY(date) = 15 
       THEN case when MONTH(date) = 2 then EOMONTH(date) else DATEADD(DAY, 15, date) end                
       ELSE DATEADD(MONTH, 1, DATEADD(day,-15,date))  
       END) 

ありがとうございました。私の質問が不明な場合は申し訳ありません。

関連する問題