2009-12-14 32 views
1

我有一個類似的問題發佈,但沒有完全得到我需要的答案我有下面的SQL代碼,它是在ac#app中構建的...這段代碼工作正常,除了當日期範圍大於1個工作周時。我需要編輯代碼,以便當CSIAchieved日期落入下一個工作周時,它是SLA的「外部」。在SQL Server中計算工作周的函數

當達成日期與目標日期相同的一週內,它在SLA內部。

if (CSILOSDate.Length > 0) { 
    sql += CSILOSDate + " as [CSITarget], " + 
     CSIActualDate + " as [CSIAcheived], " + 
     "CASE WHEN " + CSILOSDate + " IS NULL OR " + CSIActualDate + 
        " IS NULL THEN 'Incomplete' " + 
       "WHEN " + CSIActualDate + " 
         <= DATEADD(DAY, 6-DATEPART(WEEKDAY, " + 
         CSIActualDate + "), " + CSIActualDate + ") " + 
        "THEN 'Inside' " + 
       "WHEN " + CSIActualDate + " <= " + CSILOSDate + 
        " THEN 'Inside' " + 
       "ELSE 'Outside' " + 
      "END AS [CSIStatus] "; 
} 
+0

你需要處理的假期? – SLaks 2009-12-14 15:34:35

+0

沒有用戶說他們會忽略假期 – jhowe 2009-12-14 15:36:15

+9

如果用戶說他們會忽略假期,這幾乎可以肯定地表明你將不得不處理假期;) – 2009-12-14 15:43:49

回答

1

爲什麼不加另一種情況是首例

"Case When DateDiff(week, '" + CSIActualDate + 
     "', '" + CSILOSDate + "') > 0 Then 'Outside'" 
+ --- then the rest of the cases ... 
+0

輝煌,正是我期待的......謝謝! – jhowe 2009-12-14 16:34:11

0

首先,我建議您使用參數化查詢。

而且,應該這行:

WHEN CSIActualDate <= DATEADD(DAY, 6-DATEPART(WEEKDAY, CSIActualDate), CSIActualDate) 
    THEN 'Inside' 

實際上是:

WHEN CSIActualDate <= DATEADD(DAY, 6-DATEPART(WEEKDAY, CSILOSDate), CSILOSDate) 
    THEN 'Inside' 
+0

不,因爲我將實際日期與我的SLA的計算日期進行比較... – jhowe 2009-12-14 16:16:09

+0

是的,但是在您的代碼中,您將實際日期與自己進行比較。 – 2009-12-14 16:29:27

0
if (CSILOSDate.Length > 0) 
     { 
      sql += 
       CSILOSDate + " as [CSITarget], " + 
       CSIActualDate + " as [CSIAcheived], " + 
       "CASE WHEN DATEDIFF(WEEK, " + CSILOSDate + ", " + CSIActualDate + ") > 0 Then 'Outside'" + 
       "WHEN " + CSILOSDate + " IS NULL OR " + CSIActualDate + " IS NULL THEN 'Incomplete' " + 
       "WHEN " + CSIActualDate + " <= DATEADD(DAY, 6-DATEPART(WEEKDAY, " + CSIActualDate + "), " + CSIActualDate + ") " + 
       "THEN 'Inside' " + 
       "WHEN " + CSIActualDate + " <= " + CSILOSDate + " THEN 'Inside' " + 
       "END AS [CSIStatus] ";