如何在Oracle SQL中将YYYY_MM转换为日期?



我有一个列,其中日期作为文本。比如:'2021_01'(我将把这一列保存为TextDate)

我用下面的代码将其转换为'2021-01':
SELECT REPLACE(at.TextDate,'_','-') as DataFormat FROM tableName at

但是当我尝试将其强制转换为日期或将其转换为日期时,我总是得到'Missing expression'错误。我试过了:

SELECT REPLACE(CONVERT(VARCHAR(7), at.TextDate, 126, '_', '-') as date FROM tableName at  

但是它会给我错误。任何建议吗?

convert在Oracle中的含义与在其他地方完全不同。您需要to_date()功能:

SELECT TO_DATE(at.textDate, 'YYYY_MM') as DataFormat FROM tableName at

如果你想以一种特定的格式显示它,那么你可以让你的客户端/应用程序这样做——大多数客户端默认会使用你的会话的NLS_DATE_FORMAT设置——或者显式地将它转换回一个具有互补to_char()功能的字符串。

,db&lt的在小提琴

有效的日期元素也在文档中。你应该只转换成字符串显示;当你操作或存储它时,你应该把它当作一个日期。


我如何使用它筛选最后3个月?

您需要使用Oracle语法,而不是SQL Server或其他语法。您也不能在同一查询级别中引用列别名。所以你可以重新计算日期值;或者,由于您的字符串格式相对合理,您可以将目标日期转换为字符串并进行比较,这可能允许使用索引。比如:

SELECT TO_DATE(at.textDate, 'YYYY_MM') as DataFormat
FROM tableName at
WHERE at.textDate >= TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -3), 'YYYY_MM')

,db&lt的在小提琴

TO_DATE与适当的格式掩码。

只是想知道什么是什么:

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';
Session altered.

代码:

SQL> select to_date('2021-01', 'yyyy_mm') from dual;
TO_DATE('2021-01','
-------------------
01.01.2021 00:00:00
SQL>

相关内容

  • 没有找到相关文章

最新更新