首页 > 解决方案 > 如何在 Oracle SQL 中将 YYYY_MM 转换为日期?

问题描述

我有一列将日期作为文本。喜欢:'2021_01'(我将把这个专栏收藏为 TextDate)

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

但是,当我尝试将其转换为日期或将其转换为日期时,我总是会收到“缺少表达式”错误。我试过这个:

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

但它会给我错误。有什么建议吗?

标签: sqldateoracle-sqldeveloper

解决方案


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<>小提琴


推荐阅读