提取日期并将其转换为字符
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 */)
如何提取日期并将其转换为 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 */)