【问题标题】:How to write a date concisely in SQL?如何在 SQL 中简洁地编写日期?
【发布时间】:2020-10-03 10:26:34
【问题描述】:

我有雇员表:

CREATE TABLE employee 
(
    id            integer        PRIMARY KEY,
    surname       character(15),
    employed_date date
);

我在其中插入以下行:

INSERT INTO employee 
VALUES (4, 'Smith', to_date('2015-11-28','YYYY-MM-DD'));

我可以直接写吗?

INSERT INTO employee 
VALUES (4, 'Smith', '2015-11-28');

它适用于我的 PostgreSQL 安装。但是,我想编写也适用于其他数据库的可移植代码,包括 Oracle、SQL Server、MySQL 和 SQLite;以及任何语言环境。

它是否也适用于这些数据库?如果不是,那么这些数据库中可能有另一种格式和/或 ANSI 标准?

【问题讨论】:

  • ISO 8601 是标准日期格式,即 YYYY-MM-DD。然而,几乎所有可移植的 SQL 代码几乎都是不可能的,尤其是对于日期处理。如果您想编写可移植代码,请使用 SQL 构建器库。

标签: sql


【解决方案1】:

大多数 DBMS(但不包括 SQL Server 和 SQLite)支持具有固定 YYYY-MM-DD 格式的 ANSI/标准 SQL 日期文字

date '2020-09-20'

时间和时间戳类似:

time '12:34:56'
timestamp '2020-09-20 12:34:56.02'

【讨论】:

  • 我在OraclePostgreSQLMySQL 文档中找到了这种文字格式。我在 SQL Server 文档中找不到它 - 也许 SQL Server 有这样的文字:{d '2015-11-28'} (link)?
  • 我不知道手册中的确切位置,但至少从 SS2014 开始它是有效的 T-SQL
  • 对不起,我的错,SQL Server 仍然不支持,Gordon 是对的。 SQLite 也一样
【解决方案2】:

首先,您使用char() 类型作为姓氏。这种类型用空格填充名称,这对于名称通常是不可取的。一般来说,您需要 varchar() 来表示名称:

CREATE TABLE employee (
    id            integer        PRIMARY KEY,
    surname       varchar(15),
    employed_date date
);

我应该补充一点,对于姓氏来说,15 个字符可能不够长。

或者nvarchar()。尽管 Oracle 推荐 varchar2(),但上述方法适用于您提到的所有数据库。

关于日期常量,插入的方式基本上有两种:

date '2020-11-03'
'2020-11-03'

第一个是标准 SQL,但并非所有数据库都支持它。在您提到的数据库中,只有 Oracle 需要 date 关键字。 SQL Server 和 SQLite 不允许这样做。
如果需要日期,则不允许date 的数据库会将字符串转换为日期。

因此,没有单一的方法可以传入适用于您提到的数据库的日期常量。嗯,主要的例外是甲骨文。并且您可以更改默认日期格式以接受 YYYY-MM-DD 而不是 DD-MMM-RR,但这很少这样做。

【讨论】:

  • 1.我知道character(15) 类型可能不太适合。我正在将教程数据库中的 VARCHAR2(15) 从 Oracle 迁移到 Postgres,并临时选择了它。 2.我在Oracle和Postgres中使用的SQL Server link中甚至没有to_date()
  • 如果没有通用的常量格式,那么也许Oracle、SQL Server、MySQL和Postgres有一些通用的函数;喜欢Cast or Convert?
  • @iwis 。 . .这种可能性更小。
【解决方案3】:

您可以使用下面的 sql 语句将新员工添加到员工表中。日期格式为 'YYYY-MM-DD'。

 INSERT INTO employee (id,name,date) VALUES (4, 'Smith', '2015-11-28')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多