如何在 Oracle SQL 中将 YYYY_MM 转换为日期?
How do you convert YYYY_MM to date in Oracle SQL?
我有一列以日期作为文本。喜欢:'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
means something completely different in Oracle than it does elsewhere. You need the to_date()
function:
SELECT TO_DATE(at.textDate, 'YYYY_MM') as DataFormat FROM tableName at
如果您想以特定格式显示它,那么您可以让您的 client/application 这样做 - 默认情况下大多数客户端将使用您会话的 NLS_DATE_FORMAT
设置 - 或者明确地将其转换回具有互补 to_char()
function.
的字符串
有效的日期元素也是 in the documentation。不过,您应该只转换为字符串以供显示;当您操作或存储它时,您应该将其视为日期。
How can I filter last 3 months with it?
您需要使用 Oracle 语法,而不是 SQL 服务器或其他语法。您也不能在同一级别的查询中引用列别名。所以你可以重新计算日期值;或者由于您的字符串格式相对合理,您可以将目标日期转换为字符串并进行比较,这可能允许使用索引。类似于:
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')
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>
我有一列以日期作为文本。喜欢:'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
means something completely different in Oracle than it does elsewhere. You need the to_date()
function:
SELECT TO_DATE(at.textDate, 'YYYY_MM') as DataFormat FROM tableName at
如果您想以特定格式显示它,那么您可以让您的 client/application 这样做 - 默认情况下大多数客户端将使用您会话的 NLS_DATE_FORMAT
设置 - 或者明确地将其转换回具有互补 to_char()
function.
有效的日期元素也是 in the documentation。不过,您应该只转换为字符串以供显示;当您操作或存储它时,您应该将其视为日期。
How can I filter last 3 months with it?
您需要使用 Oracle 语法,而不是 SQL 服务器或其他语法。您也不能在同一级别的查询中引用列别名。所以你可以重新计算日期值;或者由于您的字符串格式相对合理,您可以将目标日期转换为字符串并进行比较,这可能允许使用索引。类似于:
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')
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>