提取并将日期转换为字符

问题描述 投票:0回答:3

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

感谢任何帮助

sql firebird firebird2.5
3个回答
0
投票

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

EXTRACT(MONTH FROM somedate)的返回值是一个整数,而不是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 */)

-2
投票

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

选择to_char(sysdate,'mon','NLS_DATE_LANGUAGE = English')作为双月

如果您的会话默认语言已经是您想要的语言,那么您可以提供“当地语言”而不是英语,而不需要第三个参数,这就足够了;

选择to_char(sysdate,'mon')作为双月的月份


-2
投票

我不知道你怎么能在firebird中做到这一点,但你可以在microsoft sql server中这样做,如下所示:

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
© www.soinside.com 2019 - 2024. All rights reserved.