извлечь и преобразовать дату как символ - PullRequest
0 голосов
/ 26 апреля 2019

как мне извлечь дату и преобразовать ее в трехбуквенный символ? То, к чему я пытаюсь приблизиться, - это колонка с 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 голосов
/ 26 апреля 2019

Я не знаю, как вы можете сделать это в 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
0 голосов
/ 26 апреля 2019

Если показанный запрос является вашим фактическим запросом, вы получите сообщение об ошибке «Token unknown», так как 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.

Ваш код можно упростить, используя искомый регистр , поскольку это позволяет избежать повторного извлечения:

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 */)
0 голосов
/ 26 апреля 2019

В oracle вы можете использовать функцию to_char;

выберите to_char (sysdate, 'mon', 'NLS_DATE_LANGUAGE = English') в качестве месяца от двойного

Вместо английского вы можете указать "вашlocal language ', если язык по умолчанию для ваших сессий уже на вашем желаемом языке, тогда нет необходимости в 3-м параметре, этого будет достаточно;

выберите to_char (sysdate,' mon ') в качестве месяца из двойного значения

...