如何提取日期并将其转换为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)
的返回值是一个整数,而不是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 */)
在oracle上你可以使用to_char函数;
选择to_char(sysdate,'mon','NLS_DATE_LANGUAGE = English')作为双月
如果您的会话默认语言已经是您想要的语言,那么您可以提供“当地语言”而不是英语,而不需要第三个参数,这就足够了;
选择to_char(sysdate,'mon')作为双月的月份
我不知道你怎么能在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