5

sql server 2005テーブルに、従業員が勤務していた月数を保持する列があります。

従業員が従事した日付もあるので、「months_In_Service」列を計算列にします。

ここDATEDIFF(month,[DateEngaged],GETDATE())で、サービスの月の計算列の式として使用すると、結果が正しい場合と正しくない場合があります。

DateEngaged値と現在の日付の間の月数を取得するためのより信頼性の高い方法は何でしょうか?計算列でどの数式を使用する必要がありますか?

4

4 に答える 4

12

のようなもの(テストされていない、1と0を交換する必要があるかもしれません)

datediff(month,[DateEngaged],getdate()) +
 CASE WHEN DATEPART(day, [DateEngaged]) < DATEPART(day, getdate()) THEN 1 ELSE 0 END

DATEDIFFは、月の境界を測定します。たとえば、月の記念日ではなく、毎月1日の00:00の時刻です。

編集:OPのコメントを見た後、開始日>終了日である場合は1を引く必要があります

DATEDIFF (month, DateEngaged, getdate()) -
 CASE
   WHEN DATEPART(day, DateEngaged) > DATEPART(day, getdate()) THEN 1 ELSE 0
 END

したがって、12月20日から1月13日まで、DATEDIFFは1を返し、次に20> 13を与えるので、1=ゼロか月を引きます。

于 2010-01-13T07:12:52.010 に答える
4

gbnと同じアプローチですが、キーストロークが少なくなります:-)

SELECT 
    DATEDIFF(MONTH, DateEngaged, GETDATE()) +
    CASE 
        WHEN DAY(DateEngaged) < DAY(GETDATE())
        THEN 1 
        ELSE 0 
    END
于 2010-01-13T07:23:59.760 に答える
1

たぶんあなたは次のようなものが欲しいでしょう:

(year(getdate())-year([DateEngaged]))*12+(month(getdate())-month([DateEngaged]))
于 2010-01-13T07:13:37.367 に答える
-2

その月が30日間の意味であると推測する場合は、値を丸めることもできます

round((datediff(day,[DateEngaged],getdate()))/30.00,0)
于 2010-01-13T07:20:16.887 に答える