是否可以创建一个自动将 SQL 值从日期转换为字符串的函数?

Posted

技术标签:

【中文标题】是否可以创建一个自动将 SQL 值从日期转换为字符串的函数?【英文标题】:Is it possible to create a function that auto converts SQL values from date to string? 【发布时间】:2021-03-12 23:20:47 【问题描述】:

例如使用以下查询:

SELECT first_name, last_name, TO_CHAR(birthday, 'MM/DD/YYYY') as birthday FROM master

有什么方法可以让我放弃 TO_CHAR 声明并让数据库自动为我转换值?我一直在尝试找到一个动态解决方案,以便它自动转换每个表中 DATE 列中的任何值,但无济于事。

理想情况下,我只想运行以下查询:

SELECT first_name, last_name, birthday FROM master

以所需格式获取所有值。是否也可以反之亦然:

INSERT INTO master (first_name, last_name, birthday) 
VALUES (:first_name, :last_name, TO_DATE(:birthday, 'MM/DD/YYYY'))

到:

INSERT INTO master (first_name, last_name, birthday) 
VALUES (:first_name, :last_name, :birthday)

【问题讨论】:

这个答案可能对你有帮助:***.com/a/50164234/14853083 MM/DD/YYYY 不是存储的好格式,因为搜索和比较很复杂。使用YYYY-MM-DDYYYYMMDD @AbraCadaver - 给定 OP,很明显该列是 DATE,而不是 CHAR 或 VARCHAR。所以它 以 'MM/DD/YYYY' 或任何其他字符格式存储。他想知道如何将 from 字符串格式 转换为 DATE 类型,而不必使用 TO_CHAR 或 TO_DATE。 【参考方案1】:

如果您以日期开头,但 Oracle 需要它作为字符串(例如用于显示输出!),您可以使用 TO_CHAR,带或不带格式模型(以及一些其他需要的参数),或者您不要使用任何东西,Oracle 会为您隐式调用 TO_CHAR,并使用参数的默认值。最重要的当然是日期格式模型。这是一个名为nls_date_format 的会话参数;要查看所有您的 nls 设置,您可以运行

select * from v$nls_parameters;

相反,如果您以字符串开头,但 Oracle 需要日期(例如,插入日期数据类型的列中,或用于某些日期计算等),您可以使用 TO_DATE,与或者没有日期格式模型,或者 Oracle 为您调用它 - 再次使用默认值,包括 nls_date_format

请注意,某些(但不是全部)前端会忽略您的 nls_date_format 并使用您在用户界面中找到的设置。如果你问我,这是一个愚蠢的功能,但你只需要知道它。

还要注意timestampdate 是不同的,它们使用不同的nls 参数进行默认格式设置。与timestamp with time zone 相同。因此,如果某些地方看起来不正确,请仔细考虑数据类型。

在我的系统上:

select value from v$nls_parameters where parameter = 'NLS_DATE_FORMAT';


VALUE                                                           
----------------------------------------------------------------
dd-MON-yyyy

select sysdate from dual;   -- I didn't use `to_char` so Oracle did

SYSDATE    
-----------
12-MAR-2021

create table t (dt date);

insert into t (dt) values ('12-OCT-2020');  -- BAD PRACTICE!

select * from t;

DT         
-----------
12-OCT-2020

现在,请注意,隐式转换团队会追捕滥用隐式转换的开发人员。既然您知道它是如何完成的,那么永远不要在任何重要的地方(例如在生产中)这样做。在开发查询时快速构建测试用例是可以的;一般情况下非常糟糕的做法。根据需要使用TO_CHARTO_DATE,你会没事的!

【讨论】:

你打败了我。一个很好的解释,很好地解释了这一切。 另见:Oracle's default DATE format。默认值取决于数据库中设置的区域;因此,当您在国际环境中工作时,您应该切勿依赖隐式转换,因为不同国家/地区的用户可能具有不同的默认 NLS_DATE_FORMAT 值。【参考方案2】:

要克服数据库中数据类型转换的所有难题,请尝试将日期数据类型更改为时间戳,并在您的应用中获取它时尝试使用 date() 函数将其转换为日期。

【讨论】:

OP 的问题是关于让数据库完成这项工作。建议他们在他们的应用程序中完成这项工作是不恰当的。 我投了反对票,因为这是个坏建议。告诉 OP 他应该将他的 DATE 列更改为时间戳“以克服数据类型转换的所有麻烦”,然后必须在应用程序中转换为 DATE?与字符串的额外转换?认真的吗?

以上是关于是否可以创建一个自动将 SQL 值从日期转换为字符串的函数?的主要内容,如果未能解决你的问题,请参考以下文章

将参数值从字符串转换为日期时间失败

是否可以将 js 字符串转换为日期以将其上传到 SQL 数据库?

json中的String类型的日期为啥自动转换成date类型

sql字符串转换日期

将日期转换为字符串以进行自动目录搜索

是否有根据日期转换为 PST 或 PDT 的 SQL 函数?