我有一个列,其中日期作为文本。比如:'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<的在小提琴
有效的日期元素也在文档中。你应该只转换成字符串显示;当你操作或存储它时,你应该把它当作一个日期。
我如何使用它筛选最后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<的在小提琴
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>