【问题标题】:Microsoft Access DateTime Default Now via SQLMicrosoft Access DateTime 默认现在通过 SQL
【发布时间】:2010-11-01 14:50:00
【问题描述】:

我正在编写许多脚本来更新许多 Access 表。我想为每个字段添加一个名为“date_created”的字段,该字段是创建记录时的时间戳。通过表格视图执行此操作很简单,只需设置 DefaultValue = now()。但是,我将如何在 sql 中完成此操作?

这是我目前对已有该列的表的尝试。此示例使用“tblLogs”。

ALTER TABLE tblLogs ALTER COLUMN date_created DEFAULT now()

感谢您的帮助!

更新 - 有没有办法在 VBA 中做到这一点?

更新 2 - 在最短和最准确的一天之前测试了所有答案和以下内容

CurrentProject.Connection.Execute _
    "ALTER TABLE tblLogs ALTER date_created DATETIME DEFAULT NOW() NOT NULL;"

【问题讨论】:

  • Now() 是一个愚蠢的函数,如果你想要 DATE 的话。您真正想要的是将默认值设置为 Date()。
  • 他们说“日期时间...记录创建时间的时间戳”,NOW() 函数最适合。
  • 好吧,将字段名称与输入的数据协调起来会更准确,但称其为“傻”是不礼貌的。建设性反馈不应居高临下,也不应包含任何侮辱。
  • 带有 date_ 前缀的列名是否意味着最小的粒度将是一天(换句话说,没有时间元素)是有争议的,例如ACE/Jet 只有一种时间数据类型是 DATETIME,“DATE”是它的同义词。您需要一个约束(或验证规则)来确保 DATETIME 值没有时间元素,例如约束 date_created__no_time_element CHECK(date_created = DATEADD('D', DATEDIFF('D', #1990-01-01 00:00:00#, date_created), #1990-01-01 00:00:00#);跨度>

标签: sql ms-access vba ddl


【解决方案1】:

我假设:

  • 您的目标数据库是 ACE 或 Jet 引擎,而不是 SQL Server;
  • 您需要日期时间,即标准 SQL 中的 CURRENT_TIMESTAMP(虽然 ACE/Jet 不直接支持),但不要与 SQL Server 的 TIMESTAMP 数据混淆类型;
  • 您希望使用 SQL DDL 获得答案。

如果您使用此 SQL DDL 创建表:

CREATE TABLE tblLogs 
(
   date_created DATETIME NOT NULL
);

然后以下 SQL DDL 将添加 DEFAULT 您的要求:

ALTER TABLE tblLogs ALTER 
   date_created DATETIME DEFAULT NOW() NOT NULL;

上面的 ACE/Jet SQL 语法是 ANSI-92 查询模式风格。要通过 MS Access 接口(例如查询对象的 SQL 视图)使用它,请参阅Microsoft Office Access: About ANSI SQL query mode (MDB)。要使用 SQL DDL 以编程方式执行此操作,需要 (AFAIK) 使用 OLE DB,而在 VBA 中需要 (AFAIK) 使用 ADO。 DAO 始终使用 ANSI-89 查询模式语法,其 SQL DDL 语法缺乏对DEFAULT 的支持。

如果您使用的是 Access(而不是独立的 ACE/Jet),则可以使用一行 VBA (ADO) 代码:

CurrentProject.Connection.Execute "ALTER TABLE tblLogs ALTER date_created DATETIME DEFAULT NOW() NOT NULL;"

【讨论】:

    【解决方案2】:

    我建议要创建或重组 Jet 表,请使用 DAO 而不是 DDL。它提供了控制 Jet 的 DDL 实现中缺少的属性的能力。 Access 帮助应该会为您提供所需的内容。

    【讨论】:

    • 那些“Jet 的 DDL 实现中缺少的属性”相当模糊(曾经使用过它们吗?!)并且绝对不包括 DEFAULT!但是 OP 还要求提供一些 VBA,那么您如何发布多行等效的 DAO 代码,看看他们是否更喜欢单行 SQL DDL 或单行 Access+ADO 代码? :)
    • 我不会以任何形式的代码创建表格。我不明白这一点。
    • 不管您如何创建表,您是否曾明确使用过那些“Jet 的 DDL 实现中缺少的属性”?
    • 顺便说一句,在代码而不是 GUI 中创建表格的目的是让您的操作可以重复和复制,例如如果我想在 SO 上描述 ACE/Jet 功能,我倾向于发布 VBA 脚本以在 Windows 临时文件夹中制作 .mdb、创建表、插入测试数据并执行 SQL tp 重现问题。 IMO 让读者尽可能轻松地重现场景。如果我改为发布有关如何操作 Access UI 以执行相同操作的说明,我怀疑很多人会费心去实际重现该场景。
    • 自 1996 年以来,我一直在在线 Access 论坛上发帖,并且从未需要发布 DDL 来描述表结构,因此我认为您的观点非常薄弱。大多数时候,我看到 DDL 描述了整个表结构,我看到了太多的信息,并且没有对帖子进行足够的修剪到关键点。对于那些不太擅长在技术论坛上提问的人,也许还有更多信息。更好,但我宁愿看到人们更好地表达他们的问题,而不是提供大量不适用于特定问题的信息。
    【解决方案3】:

    您可以使用 getdate() 代替 now()。无法检查语法的其他部分(这里没有 sql,我很少更改表 :)),但应该差不多。

    编辑: 似乎 SQL 不允许如此轻易地更改默认值。查看this page,其中提供了实际示例 - 您需要更改约束,因为 MSSQL 将默认值视为约束。抱歉信息有误。

    【讨论】:

    • 我试过了,但没有用。谢谢你的回答。 GetDate() 将在今天返回,但不是确切的第二个,据我所知,它将与 Now() 几乎相同。
    • getdate() 返回全职,不用担心。
    • 显然 MSSQL 的默认设置有点困难——你必须删除/创建特定的约束。我编辑了我的答案以反映这一点。
    • 哇,这真的很奇怪。很好的发现!
    • 我原以为“Microsoft Access DateTime Default Now via SQL”意味着他们使用的是 ACE/Jet 而不是 SQL Server。
    【解决方案4】:

    在 SQL Server 中是:

    ALTER TABLE tblLogs ALTER COLUMN date_created DEFAULT getDate()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 2017-07-11
      • 1970-01-01
      相关资源
      最近更新 更多