2009-07-02 37 views
0

如何在選擇查詢中給出where條件?如何在選擇查詢中給出where條件?

ACCESS 2003

我的查詢

SELECT RECORDNO, PERSONID, EMPNAME, TITLENAME, DEPARTMENT, NATION, 
CARDEVENTDATE, INTIME, OUTTIME, (select TOP 1 F1.CARDEVENTDATE from 
tmp_cardevent as F1 where F1.RECORDNO < F2.RECORDNO AND F1.PERSONID = 
F2.PERSONID order by F1.RECORDNO DESC, F1.PERSONID DESC) AS PrevDate, 
(select TOP 1 F1.OUTTIME from tmp_cardevent as F1 where F1.RECORDNO < 
F2.RECORDNO AND F1.PERSONID = F2.PERSONID order by F1.RECORDNO DESC, 
F1.PERSONID DESC) AS PrevOut FROM tmp_cardevent AS F2 

我想用:

WHERE CARDEVENTDATE BETWEEN '" & sdate & "' AND '" & edate & "' 

從上面的查詢我怎麼可以給where條件,我嘗試這樣做:

SELECT RECORDNO, PERSONID, EMPNAME, TITLENAME, DEPARTMENT, NATION, 
CARDEVENTDATE, INTIME, OUTTIME, (select TOP 1 F1.CARDEVENTDATE from 
tmp_cardevent as F1 where F1.RECORDNO < F2.RECORDNO AND F1.PERSONID = 
F2.PERSONID order by F1.RECORDNO DESC, F1.PERSONID DESC) AS PrevDate, 
(select TOP 1 F1.OUTTIME from tmp_cardevent as F1 where F1.RECORDNO < 
F2.RECORDNO AND F1.PERSONID = F2.PERSONID order by F1.RECORDNO DESC, 
F1.PERSONID DESC) AS PrevOut FROM tmp_cardevent AS F2 
WHERE F2.CARDEVENTDATE BETWEEN '" & sdate & "' AND '" & edate & "' 

但它顯示「數據類型不匹配錯誤」

而且我也試過:

SELECT RECORDNO, PERSONID, EMPNAME, TITLENAME, DEPARTMENT, NATION, 
CARDEVENTDATE, INTIME, OUTTIME, (select TOP 1 F1.CARDEVENTDATE from 
tmp_cardevent as F1 where F1.RECORDNO < F2.RECORDNO AND F1.PERSONID = 
F2.PERSONID and F2.CARDEVENTDATE BETWEEN '" & sdate & "' AND '" & edate 
& "' order by F1.RECORDNO DESC, F1.PERSONID DESC) AS PrevDate, (select 
TOP 1 F1.OUTTIME from tmp_cardevent as F1 where F1.RECORDNO < 
F2.RECORDNO AND F1.PERSONID = F2.PERSONID order by F1.RECORDNO DESC, 
F1.PERSONID DESC) AS PrevOut FROM tmp_cardevent AS F2 WHERE 
F2.CARDEVENTDATE BETWEEN '" & sdate & "' AND '" & edate & "' 

但它顯示相同的「數據類型不匹配錯誤」

任何一個可以幫我請

回答

0

與其將文字串插入SQL文本中,不如考慮使用預準備語句。這不僅可以爲您提供SQL注入保護,還可以將參數值的創建推遲到您選擇的數據訪問庫中。以下ADO代碼使用Access數據庫引擎的專用OLE DB提供程序創建值DATETIME值和VBA函數CDate()以使用本地計算機上的Windows區域設置(可能不同於機器與數據庫文件,當然):

Dim sDate As String 
sDate = 4/1/09" ' ambiguous DATETIME value 

Dim eDate As String 
eDate = "2009-12-31 23:59:59" ' unambiguous DATETIME value 

Dim cmd As ADODB.Command 
Set cmd = New ADODB.Command 
With cmd 
    .ActiveConnection = CurrentProject.Connection ' Access UI object 
    .CommandText = _ 
     "SELECT * " & _ 
     " FROM Cards " & _ 
     " WHERE CARDEVENTDATE BETWEEN :start_date AND :end_date;" 
    .Parameters.Append .CreateParameter(_ 
     ":start_date", adDate, adParamInput, , CDate(sDate)) 
    .Parameters.Append .CreateParameter(_ 
     ":end_date", adDate, adParamInput, , CDate(eDate)) 

    Dim rs As ADODB.Recordset 
    Set rs = .Execute 
End With 

MsgBox rs.GetString 

更好,使它成爲一個存儲過程例如做這個曾經在設計時:

CurrentProject.Connection.Execute _ 
    "CREATE PROCEDURE GetCards " & _ 
    "(" & _ 
    " :start_date DATETIME, " & _ 
    " :end_date DATETIME " & _ 
    ") " & _ 
    "AS " & _ 
    "SELECT * " & _ 
    " FROM Cards " & _ 
    " WHERE CARDEVENTDATE BETWEEN :start_date AND :end_date;" 

然後在運行時每次都使用這樣的:

.CommandText = _ 
    "EXECUTE GetCards :start_date, :end_date;" 

這樣,如果你的查詢需要改變(但所需要的參數沒有 - 你可以隨時儘管可以添加可選參數),但您可以在一個後端更改proc,而不必在所有前端更改SQL代碼。

5

訪問使用#作爲日期文字的分隔符,而不是'。您需要相應地進行更換。

+0

正確,快速! +1 – Cerebrus 2009-07-02 12:05:36