如何更新 SQL 中名为 Date 的列?

How do I update a column named Date in SQL?

我有一个 table,它有一个名为 Date 的列。这会导致问题,因为 Date 是数据类型名称。我尝试了以下语句来逃避它:

Update Tables.Subtable SET `Date` = "2022-03-14 07:20:32"  WHERE ID=960646;
Update Tables.Subtable SET "Date" = "2022-03-14 07:20:32"  WHERE ID=960646;

Update Tables.Subtable SET Tables.Subtable."Date" = "2022-03-14 07:20:32"  WHERE ID=960646;
Update Tables.Subtable SET Tables.Subtable.`Date` = "2022-03-14 07:20:32"  WHERE ID=960646;

Update Tables.Subtable SET Subtable."Date" = "2022-03-14 07:20:32"  WHERE ID=960646;
Update Tables.Subtable SET Subtable.`Date` = "2022-03-14 07:20:32"  WHERE ID=960646;

全部都出错了。这里的正确语法是什么?

问题出在您的日期文字被双引号分隔。这应该有效:

Update Tables.Subtable SET "Date" = '2022-03-14 07:20:32'  WHERE ID=960646;

我看到您正在使用 MS SQL 服务器...

首先,SQL table 的标识符 AKA 名称、列、例程、约束......必须应用标准 SQL 规则,即:

  • 只使用数字和纯拉丁字母(没有重音...)和下划线字符
  • 不要以数字开头
  • 长度不得超过 128 个字符
  • 尽量不要使用 SQL 关键字 ("table', 'column', "date"...) 除非名称被双引号包围

因此,名为 Date 的列必须用双引号括起来,并且在 SQL Server

中可以完美运行
SELECT "Date", ...

一些 RDBMS 添加了特定的环绕技术。在 SQL 服务器中,您可以使用方括号来这样做...

SELECT [Date], ...

您查询中的另一个问题可能是日期时间格式。

如果列使用不推荐的 DATETIME 数据类型,无论会话设置如何,唯一支持的日期和时间格式是短 SQL ISO 格式,即:

'AAAAMMJJ hh:mm:ss.nnn'

你可以执行这段文字说服你:

SET LANGUAGE French;

SELECT CAST('2022-12-31 23:59:58' AS datetime) AS "Date";

--> Msg 242, Niveau 16, État 3, Ligne 3 La conversion d'un type de données varchar en type de données datetime a créé une valeur hors limites.

SET LANGUAGE English;

SELECT CAST('2022-12-31 23:59:58' AS datetime) AS "Date";

Date
-----------------------
2022-12-31 23:59:58.000

第一次测试表明,对于某些语言,这种格式 (Long SQL ISO) 是不可接受的table。

但是当你使用短 SQL ISO 格式时,没有问题...

SET LANGUAGE French;

SELECT CAST('20221231 23:59:58' AS datetime) AS "Date";

Date
-----------------------
2022-12-31 23:59:58.000

SET LANGUAGE English;

SELECT CAST('20221231 23:59:58' AS datetime) AS "Date";

Date
-----------------------
2022-12-31 23:59:58.000

当使用数据类型 DATE、DATETIME2、DATETIMEOFFSET、TIME 时,无论会话设置如何,唯一受支持的格式称为 long SQL ISO,依赖于 'AAAA-MM-JJ hh:mm:ss.nnnnnnn'。由于与 XML 的某些兼容性原因,标准 XML 日期时间格式也受支持 'YYYY-MM-DDThh:mm:ss.nnnnnnn'

如您在我的测试中所见:

SET LANGUAGE French;

SELECT CAST('2022-12-31 23:59:58' AS datetime2) AS "Date";

SET LANGUAGE English;

SELECT CAST('2022-12-31 23:59:58' AS datetime2) AS "Date";

现在两个 SQL 语句可以正常工作...

注意:.nnn...部分不是必需的,比例可以更小。

为什么有两种格式? 一种(短 SQL ISO)用于 DATETIME / SMALLDATETIME,第二种(长 SQL 格式)...因为SQL ISO 标准与时俱进。第一种格式是为 SQL ISO 标准的 SQL 2 (1992) 完成的。 SQL:1999 发布后的第二个。 DATETIME 和 SMALDATETIME 是八十年代末从 Sybase 继承而来的。 DATETIME2、DATE 和 DATTIME 偏移量已在 SQL Server 2008 中发布...