首页 > 解决方案 > 提取日期并将其转换为字符

问题描述

如何提取日期并将其转换为 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,

感谢任何帮助

标签: sqlfirebirdfirebird2.5

解决方案


如果显示的查询是您的实际查询,那么您会收到一个错误“令牌未知”,因为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

字符文字已经是CHARCHAR(3)在这种情况下),因此不需要强制转换。但是,如果您真的需要强制转换,那么我建议将强制转换放在整个,而不是围绕子句CASE ... END中的各个值。THEN

如果你想进一步压缩这个,你也可以使用这个DECODE函数:

DECODE(EXTRACT (MONTH FROM "DATE"), 1, 'JAN', 2, 'FEV', 3, 'MAR' /* ... etc */)

推荐阅读