如何在sql中将数字转换为日期

Posted

技术标签:

【中文标题】如何在sql中将数字转换为日期【英文标题】:How to convert number to date in sql 【发布时间】:2021-11-21 06:10:00 【问题描述】:

我在 python 中使用 sql 从 oracle 获取数据。有些列具有整数值。我想在检索数据时将这些列值转换为日期。

connection = cx_Oracle.connect(user, pwd, dsn, encoding="UTF-8")
cursor = connection.cursor()
results = cursor.execute("SELECT TO_DATE(DATECREATED,'yyyymmdd') as DATECREATED from ARADMIN.EPM_TechnicianInformation").fetchall()

它不工作。

【问题讨论】:

“它不工作”是什么意思?因为,例如select to_date(20210929, 'yyyymmdd') from dual; 返回正确的结果,因为20210929 代表yyyymmdd 格式的有效“日期”。 我想使用实际的表名而不是对偶来将列值直接转换为日期。上面的查询给了我错误 - DatabaseError: ORA-01843: not a valid month 我只是说如果你传递给它的值代表一个有效的日期值,那么查询就可以正常工作。 当然你会使用自己的桌子。由于您得到的错误:并非所有值都有有效日期。当 Oracle 抱怨 invalid month 时,您有类似 20211529 的数字 - 没有月份的数字是 15。当人们将日期存储为字符串或数字时会发生这种情况,因为数据库无法为您进行任何验证。现在您必须先找到那些无效的“日期”并修复它们。 【参考方案1】:

上面的查询给了我错误 - DatabaseError:

ORA-01843: not a valid month

从 Oracle 12 开始,您可以添加一个子句来处理由于无效数据导致的转换过程中的错误:

SELECT TO_DATE(
         DATECREATED
         DEFAULT NULL ON CONVERSION ERROR,
         'yyyymmdd'
       ) as DATECREATED
FROM   ARADMIN.EPM_TechnicianInformation

样本数据:

CREATE TABLE ARADMIN.EPM_TechnicianInformation ( datecreated ) AS
SELECT 20210929 FROM DUAL UNION ALL  -- A valid date
SELECT 20211301 FROM DUAL;           -- An invalid date as month = 13

输出:

DATECREATED
2021-09-29 00:00:00
<null>

db小提琴here

【讨论】:

以上是关于如何在sql中将数字转换为日期的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SSIS 中将 Y2K 日期转换为 SQL 日期?

如何在熊猫中将字符串日期转换为数字[重复]

在 SQL(Redshift)中将字符串(43677)转换为日期格式 [关闭]

如何在 SQL 中将 varchar2 转换为数字

在 PowerBI 中将数字转换为日期格式

sql如何将字符串转为日期