将 vba 可变日期传递给 sql 语句
Passing vba variable date to sql statement
作为 vba-sql
的新手,我试图在 vba
中使用 for 循环填充 table,并在 Docmd.runsql
中填充 table.该代码工作正常,但 table 中的值是:所有记录的 12/30/1899。我使用了一个消息框来检查并且 dt
工作正常。它给了我循环中的日期并移至下一个日期,但在 table 中它只给了我一个日期:12/30/1899.
Function dateTblUpdate()
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE FROM [date-table]"
Dim dt As Date
For dt = #1/1/2010# To DateSerial(Year(Now), Month(Now), Day(Now))
'MsgBox DateSerial(Year(Now), Month(Now), Day(Now))
'MsgBox dt
DoCmd.RunSQL "Insert into [date-table] (the_date) values(" & dt & ")"
Next
DoCmd.SetWarnings True
End Function
日期-table当前结果
the_date
----------
12/30/1899
12/30/1899
12/30/1899
12/30/1899
12/30/1899
12/30/1899
但预期结果:
the_date
------------
01/01/2010
01/02/2010
01/03/2010
01/04/2010
我的日期列是日期类型,我相信 sql 认为 dt 不是日期,所以它不会保存它并保存默认日期....有什么想法吗?
由于您正在构建的 SQL 是:
Insert into [date-table] (the_date) values(1/1/2010)
解释器可能正在进行整数除法并保存一个 0
值,这是默认日期。改为将值括在井号中:
DoCmd.RunSQL "Insert into [date-table] (the_date) values(#" & dt & "#)"
在文字日期值前后包含 #
个字符。否则数据库引擎会将 26/5/2015 解释为 26 除以 5 除以 2015 ... IOW 作为数学表达式,而不是您想要的日期。
"Insert into [date-table] (the_date) values(" & Format(dt, "\#yyyy-m-d\#") & ")"
然而,如果您使用参数查询,则无需为 SQL 语句中的那些 #
个字符操心:
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim dt As Date
Dim strInsert As String
strInsert = "INSERT INTO [date-table] (the_date) VALUES (pDate)"
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strInsert)
'For dt = #1/1/2010# To DateSerial(Year(Now), Month(Now), Day(Now))
For dt = #1/1/2010# To Date
qdf.Parameters("pDate").Value = dt
qdf.Execute dbFailOnError
Next
请注意,使用 QueryDef.Execute
方法会消除 DoCmd.SetWarnings False
的动机。关闭 SetWarnings
会抑制信息,包括可能对故障排除有用的信息。
作为 vba-sql
的新手,我试图在 vba
中使用 for 循环填充 table,并在 Docmd.runsql
中填充 table.该代码工作正常,但 table 中的值是:所有记录的 12/30/1899。我使用了一个消息框来检查并且 dt
工作正常。它给了我循环中的日期并移至下一个日期,但在 table 中它只给了我一个日期:12/30/1899.
Function dateTblUpdate()
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE FROM [date-table]"
Dim dt As Date
For dt = #1/1/2010# To DateSerial(Year(Now), Month(Now), Day(Now))
'MsgBox DateSerial(Year(Now), Month(Now), Day(Now))
'MsgBox dt
DoCmd.RunSQL "Insert into [date-table] (the_date) values(" & dt & ")"
Next
DoCmd.SetWarnings True
End Function
日期-table当前结果
the_date
----------
12/30/1899
12/30/1899
12/30/1899
12/30/1899
12/30/1899
12/30/1899
但预期结果:
the_date
------------
01/01/2010
01/02/2010
01/03/2010
01/04/2010
我的日期列是日期类型,我相信 sql 认为 dt 不是日期,所以它不会保存它并保存默认日期....有什么想法吗?
由于您正在构建的 SQL 是:
Insert into [date-table] (the_date) values(1/1/2010)
解释器可能正在进行整数除法并保存一个 0
值,这是默认日期。改为将值括在井号中:
DoCmd.RunSQL "Insert into [date-table] (the_date) values(#" & dt & "#)"
在文字日期值前后包含 #
个字符。否则数据库引擎会将 26/5/2015 解释为 26 除以 5 除以 2015 ... IOW 作为数学表达式,而不是您想要的日期。
"Insert into [date-table] (the_date) values(" & Format(dt, "\#yyyy-m-d\#") & ")"
然而,如果您使用参数查询,则无需为 SQL 语句中的那些 #
个字符操心:
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim dt As Date
Dim strInsert As String
strInsert = "INSERT INTO [date-table] (the_date) VALUES (pDate)"
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strInsert)
'For dt = #1/1/2010# To DateSerial(Year(Now), Month(Now), Day(Now))
For dt = #1/1/2010# To Date
qdf.Parameters("pDate").Value = dt
qdf.Execute dbFailOnError
Next
请注意,使用 QueryDef.Execute
方法会消除 DoCmd.SetWarnings False
的动机。关闭 SetWarnings
会抑制信息,包括可能对故障排除有用的信息。