Access数据库默认日期不能包含00小时,00分钟或00秒

时间:2009-10-01 03:57:44

标签: ms-access vb6

因此,我们有许多年前写过的旧VB 6应用程序。

它使用Access数据库存储数据,VB6 App作为此数据的接口 现在,改变VB6应用程序将非常困难,我试图避免这种情况。

问题是,当VB6将数据插入到访问数据库的表中时,该表有一个使用'Now()'来设置默认值的列。

现在已经对此进行了计算日期和时间值,包括乘法。因此..当任何日期/时间分量为0时,最终结果为0.

I.E dd * mm * yy * hh * n * s - 如果为零,则结果为零

为了克服这一点,我可以
•更改代码以指定日期(不是很理想)
希望在Access数据库的默认值中进行一些验证,以确保时间内没有0值

有没有办法像这样验证默认值? 像

这样的东西
If DatePart(‘hh’,date) == 0 OR DatePart(‘n’,date) = 0 OR DatePart(‘s’,Date) = 0
Then add one to all of them.

修改
这不是我的代码,这是我之前编写的代码,以及其他开发人员的开始。
我们无法确定我们的代码是生产中使用的代码。因此,为什么我宁愿不改变代码。我们计划在时间允许的情况下尽快重写。
问题每月只发生一次或两次,因此对应用程序的运行并不重要。

3 个答案:

答案 0 :(得分:5)

虽然编辑VB6应用程序可能并不理想,但它是处理问题的最有效方法。

您改变数据本身的提议似乎是一个非常糟糕的主意,因为如果以后数据被其他应用程序使用,它可能会抛弃日期。最好让应用程序以其独特的需求在运行时转换数据以执行计算。

始终以最标准的标准化格式存储数据。当你不再在那里工作时,你不知道从现在起几年后谁会使用这些数据。你想要的最后一件事是新开发人员诅咒你名字的不良业力,因为你认为改变在数据库中存储日期的标准格式是个好主意。

值得注意的是,许多Date()对象或日期库已经有了计算特定日期的秒数的方法,因此它甚至可以简化您的代码。

答案 1 :(得分:0)

无法使用列DEFAULT完成。

您可以创建一个'帮助'程序来生成日期,例如(Access Database Engine ANSI-92 Query Mode语法):

CREATE PROCEDURE AddOrderWithDefaultDate
(
  arg_OrderID INTEGER, 
  arg_CustomerID NVARCHAR(5), 
  arg_EmployeeID INTEGER 
)
AS 
INSERT INTO Orders (OrderID, CustomerID, EmployeeID, OrderDate) 
SELECT DISTINCT arg_OrderID, arg_CustomerID, arg_EmployeeID, 
       DATE() 
          + TIMESERIAL(
                       IIF(DATEPART('H', NOW()) = 0, 1, DATEPART('H', NOW())), 
                       IIF(DATEPART('N', NOW()) = 0, 1, DATEPART('N', NOW())), 
                       IIF(DATEPART('N', NOW()) = 0, 1, DATEPART('S', NOW()))
                      ) AS OrderDate
       FROM Products;

在ACE(2007)版本的Access数据库引擎之前,您可以从表中删除INSERTUPDATE权限,并授予您的“帮助程序”。

此外,您应该向列添加CHECK约束或验证规则,以确保确保未使用非法值显式插入或更新列。是的,即使权限只在你的“帮助”函数上,你也需要这个,除非你是那种只编写无错代码的神秘编码器;)

但是,坦率地说,为什么要这么麻烦?听起来您的业务逻辑无法处理DATETIME值中的零值存在问题。不要只是治疗症状:治愈疾病并修复错误的逻辑,

答案 2 :(得分:0)

如何更改将所有日期部分相乘的函数,以便在所有日期部分中添加一个,然后将它们相乘?至少在理论上,不需要首先考虑零,