将vba中的Datevariables传递给sql语句

我已经浏览了已经发布的各种不同的情况,但没有一个解决scheme似乎带来了任何的喜悦。 我试图将datevariables传递到一个SQL SELECT语句,但我被赋予了有关转换为date/时间的错误或variables没有正确定义的事实,即不正确的语法。 同样适用于variables'contractNumber',但是我期望datevariables完成,相同的将应用于'contractNumber'variables。 我曾尝试用“”/“&/#”“围绕variables,但没有任何组合似乎工作….

我使用的代码在下面,“控制”表中的date是标准的英国date – DD / MM / YYYY

Sub MEHT() Dim startdate As Date Dim enddate As Date Dim contractNumber As String startdate = Sheets("Control").Range("K8").Value enddate = Sheets("Control").Range("K10").Value contractNumber = Sheets("Control").Range("K13").Value Call ConnectSqlServer End Sub Sub ConnectSqlServer() Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Dim sConnString As String ' Create the connection string. sConnString = "Provider=SQLOLEDB;Data Source=NT124431\DW;" & _ "Initial Catalog=hdw2;" & _ "Integrated Security=SSPI;" ' Create the Connection and Recordset objects. Set conn = New ADODB.Connection Set rs = New ADODB.Recordset ' Open the connection and execute. conn.Open sConnString Set rs = conn.Execute("SELECT SAF.Tracking_Number, ORH.CUSTOMER_PO_NUMBER,MAX(DOC.DOCUMENT_NUMBER),DOC.DOCUMENT_DATE_KEY,SAF.ITEM_NUMBER, MAX(ITM.HOMECRAFT_ITEM_NUMBER), " _ & "MAX(ITM.ITEM_DESCR),MAX(ADR.ADDR_NAME),MAX(ADR.ADDR1),MAX(ADR.ZIP_5_KEY),SUM(SAF.QUANTITY_SOLD),SUM(SAF.EXTENDED_AMOUNT) " _ & ",SUM(SAF.EXTENDED_AMOUNT) / SUM(SAF.QUANTITY_SOLD) FROM SALES_FACT SAF JOIN LU_CUSTOMER_TBL CUS ON SAF.CUSTOMER_KEY = CUS.CUSTOMER_KEY " _ & "JOIN ORDER_DM ORH ON SAF.ORDER_KEY = ORH.ORDER_KEY JOIN PRODUCT_DM PRD ON SAF.PRODUCT_KEY = PRD.PRODUCT_KEY JOIN DOCUMENT_DM DOC " _ & "ON SAF.DOCUMENT_KEY = DOC.DOCUMENT_KEY JOIN LU_ITEM ITM ON SAF.ITEM_NUMBER = ITM.ITEM_NUMBER JOIN LU_ADDRESS ADR ON DOC.SHIP_TO_ADDRESS_KEY = ADR.ADDRESS_KEY " _ & "WHERE ITM.ITEM_CATEGORY_KEY NOT IN ('31010') AND SAF.TRACKING_CODE NOT IN ('F') AND PRD.PRODUCT_LINE_KEY NOT IN ('UN') AND PRD.PRODUCT_SUB_LINE_KEY NOT IN ('60P') " _ & "AND SAF.TRACKING_NUMBER = " & contractNumber & " AND SAF.EXTENDED_AMOUNT > 0 AND DOC.DOCUMENT_DATE_KEY BETWEEN CONVERT(Date, " & startdate & " , 120) AND CONVERT(Date," & enddate & " , 120) " _ & "GROUP BY ORH.CUSTOMER_PO_NUMBER, DOC.DOCUMENT_DATE_KEY,SAF.ITEM_NUMBER,SAF.Tracking_Number ORDER BY SAF.Tracking_Number,DOC.DOCUMENT_DATE_KEY") ' Check we have data. If Not rs.EOF Then ' Transfer result. Sheets("Detail").Range("A1").CopyFromRecordset rs ' Close the recordset rs.Close Else MsgBox "Error: No records returned.", vbCritical End If ' Clean up If CBool(conn.State And adStateOpen) Then conn.Close Set conn = Nothing Set rs = Nothing End Sub 

我使用的代码在下面,“控制”表中的date是标准的英国date – DD / MM / YYYY

尽pipe是一个英国人,我不会推荐使用你的date格式…

将date传递给SQL Server最安全的方法是使用“yyyy-MM-dd”。 这保证了它的工作,无论你在世界的哪个地方。

 select * from [SomeTable] where Update_Time >= '2015-08-06'