sql - 提取日期并将其转换为字符
问题描述
如何提取日期并将其转换为 3 个字母字符?我试图接近的是一个带有 3 个字母月份的专栏,就像我当地的当地语言一样。我正在尝试的代码给了我一个错误:
SELECT
DATE,
CASE
WHEN (EXTRACT (MONTH FROM DATE))= CAST(1 AS CHAR(3)) THEN CAST('JAN' AS CHAR(3))
WHEN (EXTRACT (MONTH FROM DATE))=CAST(2 AS CHAR(3)) THEN CAST('FEV' AS CHAR(3))
WHEN (EXTRACT (MONTH FROM DATE))=CAST(3 AS CHAR(3)) THEN CAST('MAR' AS CHAR(3))
WHEN (EXTRACT (MONTH FROM DATE))=CAST(4 AS CHAR(3)) THEN CAST('ABR' AS CHAR(3))
END
AS MONTH,
感谢任何帮助
解决方案
如果显示的查询是您的实际查询,那么您会收到一个错误“令牌未知”,因为DATE
它是一个保留字,并且不能在没有明确引用的情况下用作标识符。重命名您的列(强烈建议),或在查询中使用,"DATE"
而不是。DATE
的返回值EXTRACT(MONTH FROM somedate)
是一个整数,而不是 a CHAR(3)
,因此(EXTRACT (MONTH FROM DATE))= CAST(1 AS CHAR(3))
强制转换会导致额外的开销,因为 Firebird 需要将结果EXTRACT
从整数转换为字符串来评估条件。相反,您应该使用EXTRACT(MONTH FROM "DATE") = 1
.
您的代码可以通过使用搜索案例来简化,因为这样可以避免重复提取:
CASE EXTRACT (MONTH FROM "DATE")
WHEN 1 THEN 'JAN'
WHEN 2 THEN 'FEV'
WHEN 3 THEN 'MAR'
-- ... etc
END
字符文字已经是CHAR
(CHAR(3)
在这种情况下),因此不需要强制转换。但是,如果您真的需要强制转换,那么我建议将强制转换放在整个,而不是围绕子句CASE ... END
中的各个值。THEN
如果你想进一步压缩这个,你也可以使用这个DECODE
函数:
DECODE(EXTRACT (MONTH FROM "DATE"), 1, 'JAN', 2, 'FEV', 3, 'MAR' /* ... etc */)
推荐阅读
- php - 从过滤器类别中删除“全部”并设置另一个 jquery
- javascript - 数据表滚动条有时会消失
- python - 如何使用python将一系列HSV值的所有像素设置为openCV中的另一个值?
- ruby-on-rails - redirect_to new_user_session_path 不显示 Flash 消息
- javascript - 离子验证突出显示不适用于离子选择
- android - 删除部分 ImageSpan 时删除整个 ImageSpan
- ssl - TLS 记录协议如何重组接收到的数据?
- r - 在 bookdown 的 pdf_book before_body 中运行 knitr 代码块
- java - Eclipse 光子丢失 java 文件
- javascript - 鼠标右键单击IE11崩溃