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

时间:2019-04-26 14:24:51

标签: sql firebird firebird2.5

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

感谢任何帮助

3 个答案:

答案 0 :(得分:0)

如果显示的查询是您的实际查询,那么您会收到错误消息“令牌未知”,因为DATE是保留字,如果不明确引用就不能用作标识符。重命名您的列(高度建议),或在查询中使用"DATE"而不是DATE

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

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

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子句中的各个值周围。

如果您想进一步简化,也可以使用DECODE函数:

THEN

答案 1 :(得分:-2)

在oracle上,您可以使用to_char函数;

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

您可以提供“您的本地语言”,而不是英语,如果您的会话默认语言已经是您想要的语言,那么就不需要3rd参数了;

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

答案 2 :(得分:-2)

我不知道怎么用火鸟来做 但您可以在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