我目前正在使用MS Access数据库,并且遇到日期减法问题。
基本上我正在尝试创建目标日期,例如:
目标日期=截止日期 - 提前期
即。提前期可能是30天,因此目标日期应该是截止日期前30天。
我尝试使用的代码是:
strSQL = "INSERT INTO dbo_DEALER_TASK ( Dlr_Number, Action_Id, Task_Id, Area_Id,
Task_Deadline_Date, Responsible_Person_Id, Alternate_Person_Id, Priority, Comment,
Suppress_Email, Dealer_Type ) "
strSQL = strSQL & "SELECT dbo_DEALER_ACTION.Dlr_Number, dbo_DEALER_ACTION.Action_Id,
qryAllTasksToAdd.Task_Id, qryAllTasksToAdd.Area_Id, Deadline_Date - Deadline_adjustment
AS 'Task_Deadline_Date', qryAllTasksToAdd.Person_Responsible_Id,
qryAllTasksToAdd.Alternate_Responsible_Id, qryAllTasksToAdd.Priority,
qryAllTasksToAdd.Comment, qryAllTasksToAdd.Suppress_Email,
qryAllTasksToAdd.Applies_To_Dealer_Type "
strSQL = strSQL & "FROM dbo_DEALER_ACTION LEFT JOIN qryAllTasksToAdd ON
(dbo_DEALER_ACTION.Dealer_Type = qryAllTasksToAdd.Applies_To_Dealer_Type) AND
(dbo_DEALER_ACTION.Action_Id = qryAllTasksToAdd.Action_Id) "
strSQL = strSQL & WHERE (((qryAllTasksToAdd.Task_Id)=" & Me.Task_Id & ") AND
((dbo_DEALER_ACTION.Date_Completed) Is Null));"
DoCmd.RunSQL strSQL
当VBA代码执行语句时,所有内容都会正确更新,但Task_Deadline_Date字段除外,该字段保留为空白。
令我感到困惑的是,如果我独立运行此SQL语句,它会按预期工作。在尝试了许多不同的想法之后,我尝试用字符串文字日期替换“Deadline_Date - Deadline_adjustment AS'Task_Deadline_Date'”,然后声明工作正常
有没有人知道出了什么问题?
谢谢,
克里斯
答案 0 :(得分:1)
你引用了别名,你不应该这样做:
Deadline_Date - Deadline_adjustment AS Task_Deadline_Date
不
Deadline_Date - Deadline_adjustment AS 'Task_Deadline_Date'
添加引号时,该字段的名称为'Task_Deadline_Date'
根据日期字段的数据类型以及是否使用SQL Server,您可能需要使用DateAdd,例如:
DateAdd("d",-[Deadline_adjustment],[Deadline_Date])
答案 1 :(得分:0)
在Access'查询设计器中,从查询的版本开始,然后将其转换为参数查询。
WHERE
qryAllTasksToAdd.Task_Id=[which_id]
AND dbo_DEALER_ACTION.Date_Completed Is Null;
您还可以在查询开头添加PARAMETERS
语句,以通知db引擎有关参数的数据类型。例子......
PARAMETERS which_id Text ( 255 );
PARAMETERS which_id Long;
一旦您获得该查询,请保存并为其命名。然后,您的VBA过程可以使用该已保存的查询,为其提供参数值,然后执行它。
Dim db As DAO.database
Dim qdf As DAO.QueryDef
Set db = CurrentDb
Set qdf = db.QueryDefs("YourQuery")
qdf.Parameters("which_id").value = Me.Task_Id
qdf.Execute dbFailOnError
Set qdf = Nothing
Set db = Nothing
这比每次需要执行时在VBA代码中重新创建SQL语句要容易得多。
答案 2 :(得分:0)
听起来您在dbo_DEALER_TASK中插入的列的数据类型实际上并不是日期时间字段。
我尝试更换" Deadline_Date - Deadline_adjustment AS' Task_Deadline_Date'"使用字符串文字日期,然后语句正常工作
如果您的意思是' 02/20/2012' (正如您在SQL Server上正确使用的那样),那么这不应该在Access中工作,只有当您的输出列是text(= varchar / char))数据类型时才会这样做。 Access中的日期常量指定为#02/20/2012#
请在输出表中确认Task_Deadline_Date的数据类型。