2012-02-04 65 views
0

我有一個查詢,如下所示:我怎麼能這個SQL轉換爲HQL查詢

WITH CTE AS (
    SELECT MIN(att.Date) [minDate] 
    FROM Attendance att 
    WHERE att.Date between '12/01/2011 00:00:00' 
    AND '12/31/2011 00:00:00' 
    AND att.EmpID = 4700 
    GROUP BY EmpID, CONVERT(VARCHAR, att.Date , 111) 
    HAVING MIN(CONVERT(VARCHAR, att.Date , 8)) > '09:00:00') 
SELECT COUNT(minDate) FROM CTE 

我需要一個C#應用程序使用它,但我不能只使用查詢,因爲它說,查詢必須以select或from關鍵字開頭。我需要此查詢才能在HQL中工作。請幫忙。

回答

1

最後將其與這些

SELECT count(att.AttDate) 
from Attendance att 
where att.Employee.EmployeeCD = "+ empCD +" 
and att.AttDate IN 
    (SELECT MIN(att.AttDate) 
    from Attendance att 
    where att.AttDate between '" + startDate.Date + "' and '" + endDate.Date + "' 
    and att.Employee.EmployeeCD = " + empCD + " 
    GROUP BY EmployeeCD, CONVERT(VARCHAR,att.AttDate, 111) 
    having min(CONVERT(VARCHAR, att.AttDate, 8)) > '08:10:00') 
1

你必須重寫查詢。

在結果中,我們根本不關心日期,我們對通用結果感興趣的是什麼,所以我們可以從select中刪除日期並將其替換爲EmpId *。

SELECT EmpID 
    FROM Attendance att 
    WHERE att.Date between '12/01/2011 00:00:00' 
    AND '12/31/2011 00:00:00' 
    AND att.EmpID = 4700 
    GROUP BY EmpID, CONVERT(VARCHAR, att.Date , 111) 
    HAVING MIN(CONVERT(VARCHAR, att.Date , 8)) > '09:00:00') 

不,我們可以改變這個問題。

SELECT COUNT(EmpID) FROM Attendance WHERE EmpID IN (
    SELECT EmpID 
     FROM Attendance att 
     WHERE att.Date between '12/01/2011 00:00:00' 
     AND '12/31/2011 00:00:00' 
     AND att.EmpID = 4700 
     GROUP BY EmpID, CONVERT(VARCHAR, att.Date , 111) 
     HAVING MIN(CONVERT(VARCHAR, att.Date , 8)) > '09:00:00') 
); 

第二個查詢僅改寫CTE表達式,在大多數情況下,它只是語法糖。將其轉換爲HQL應該不成問題。

*我假定EmpID是唯一的。

+0

工作是,EMPID是uniq的。並非常感謝您的幫助。但查詢結果將隨該empID的所有行而出現,而不考慮所有條件。我只需要計算出現在你的第一個查詢中的行。 plz幫助。 – Almaji 2012-02-04 09:54:35

+0

第一個可能會這樣做,但第二個會返回計數。但是對於你給出的例子,結果將是null或1.因此,如果查詢的條件是正確的,你根本不需要那麼多的計數。 – 2012-02-04 13:55:06

+0

讓我詳細說明。 emp 4700在他的工作生涯中有500天的參與。根據所有條件,第二個查詢結果假設返回的出勤次數在12/1到12/31之間。所以它假設返回最好不到31?但查詢結果是500.他的總出席人數。怎麼辦? – Almaji 2012-02-04 20:52:55