0

私はT-SQLを初めて使用し、コードに出くわし、誰かが何が起こっているのかを理解するのを手伝ってくれるかどうか疑問に思っていました. コードのポイントは、次の支払いの日付を計算することです。

CASE 
WHEN MONTH(table.field-10) < MONTH(GETDATE())
     THEN CONVERT(DATE,((MONTH(GETDATE()) - MONTH(table.field-10)) *30)  + (table.field))
WHEN MONTH(table.field-10) = MONTH(GETDATE())
     THEN CONVERT(DATE,FA_NEXTDUE)
WHEN MONTH(table.field-10) > MONTH(GETDATE()) 
     THEN CONVERT(DATE,(table.field) - ((MONTH(table.field-10) - MONTH(GETDATE())) *30))
END AS CurrentDueDate
4

1 に答える 1

1

これは、年を考慮しない「月」関数を使用しているため、かなり不適切に記述されているように見えます。「フィールド」の日付の10日前が現在の日付と同じ月にあるかどうかを判断しようとしているようです。ただし、これは年を考慮していないため、出力は少し不安定です。

より良い方法は、datediff 関数を使用することです。

CASE WHEN DATEDIFF(month, getdate(), (dateadd(day, -10, table.field))) < 0 then dateadd(month, DATEDIFF(month, getdate(), (dateadd(day, -10, table.field))), table.field)
CASE WHEN DATEDIFF(month, getdate(), (dateadd(day, -10, table.field))) = 0 then CONVERT(Date, fa_nextdue)
CASE WHEN DATEDIFF(month, getdate(), (dateadd(day, -10, table.field))) > 0 then dateadd(month, DATEDIFF(month, getdate(), (dateadd(day, -10, table.field))), table.field)

この修正があったとしても、アウトプットがビジネスで必要とされるものであるかどうか、私は懐疑的です。ここで正確に何を返す必要があるかを確認するために、要件を少し掘り下げることをお勧めします。

参考までに table.field-10 = 「フィールド」の日付の 10 日前。

于 2013-03-26T01:22:41.993 に答える