提取日期并将其转换为字符

extract and convert date as character

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

感谢任何帮助

在 oracle 上你可以使用 to_char 函数;

select to_char( sysdate,'mon','NLS_DATE_LANGUAGE =English') as month from dual

您可以提供 'your local language' 而不是英语,如果您的会话默认语言已经是您想要的语言,则不需要第三个参数,这就足够了;

select to_char( sysdate,'mon') as month from dual

我不知道你如何在火鸟中做到这一点 但您可以在 Microsoft sql 服务器中执行此操作,如下所示:

SELECT 
DATE,
CASE 
when DATEPART(MONTH,[DATE])=1 THEN CAST('JAN' AS CHAR(3))
when DATEPART(MONTH,[DATE])=2 THEN CAST('FEV' AS CHAR(3))
when DATEPART(MONTH,[DATE])=3 THEN CAST('MAR' AS CHAR(3))
end
from YourTable

如果显示的查询是您的实际查询,那么您会收到错误“令牌未知”,因为 DATE 是一个保留字,不能在没有明确引用的情况下用作标识符。要么重命名您的列(强烈建议),要么在查询中使用 "DATE" 而不是 DATE

EXTRACT(MONTH FROM somedate) 的 return 值是一个整数,而不是 CHAR(3),因此 (EXTRACT (MONTH FROM DATE))= CAST(1 AS CHAR(3)) 中的转换会导致额外的开销,因为 Firebird 需要将EXTRACT 的结果从整数到字符串以评估条件。相反,您应该使用 EXTRACT(MONTH FROM "DATE") = 1.

您的代码可以通过使用 searched case 来简化,因为这样可以避免重复提取:

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 */)