3

我目前正在研究 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'”,然后该语句运行良好

有人知道出了什么问题吗?

谢谢,

克里斯

4

3 回答 3

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])
于 2013-02-21T15:15:06.883 回答
0

听起来您在 dbo_DEALER_TASK 中插入的列的数据类型实际上不是日期时间字段。

我尝试用字符串文字日期替换“Deadline_Date - Deadline_adjustment AS 'Task_Deadline_Date'”,然后该语句运行良好

如果您的意思是“2012 年 2 月 20 日”(例如,您将在 SQL Server 上正确使用),那么这在 Access 中不应该起作用,并且只有当您的输出列是文本(= varchar/char))数据类型时才会起作用. Access 中的日期常量指定为 #02/20/2012#

请在您的输出表中确认 Task_Deadline_Date 的数据类型。

于 2013-02-21T22:05:44.413 回答
0

在 Access 的查询设计器中,从可以工作的查询版本开始,并将其转换为参数查询。

WHERE
        qryAllTasksToAdd.Task_Id=[which_id]
    AND dbo_DEALER_ACTION.Date_Completed Is Null;

您还可以PARAMETERS在查询开始时添加一条语句,以告知数据库引擎您的参数的数据类型。例子 ...

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 语句要容易得多。

于 2013-02-21T16:29:27.687 回答