Select语句中的日期减法

时间:2013-02-21 15:07:19

标签: sql vba ms-access

我目前正在使用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'”,然后声明工作正常

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

谢谢,

克里斯

3 个答案:

答案 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的数据类型。