#sql #sql-server #case
Вопрос:
Пытаюсь создать новый столбец «FiscalQrtr», который использует столбец «Дата» в случае, когда, но не могу понять это, поэтому я выбрал подход обновления и получаю сообщение об ошибке, в котором говорится
«Не удалось выполнить преобразование при преобразовании значения varchar «» в тип данных int».
Столбец даты , по моему мнению, таков YYYYMM
, поэтому примером результата будет: если Дата = 200103, то FiscalQrtr = 200101
Код обновления выглядит следующим образом:
select *
into #claims1
FROM #claims
update #claims1
set Date = left(Date, len(Date)-2) '01'
where Date in ('','','');
Любая помощь будет высоко оценена
Комментарии:
1.
TxnFiscalPeriod
это явно anint
, так что ошибка здесь очень ясна.2.
where TxnFiscalPeriod % 100 BETWEEN 1 AND 3
3. Все еще не уверен, как выполнить поставленную задачу… необходимо использовать дату (столбец содержит серию ГГГГ ) для преобразования последних 2 символов в правильный финансовый квартал.
4.
select * into #claims1 FROM #claims
Это полная чушь.
Ответ №1:
Почему бы просто не сделать все 4 квартала сразу?
UPDATE #claims1
SET Date = LEFT(Date, 4) '0' RTRIM((RIGHT(Date,2)-1)/3 1);
Если вам не нравится неинтуитивная -1/3 1
математика, вы можете написать что-то гораздо более ясное по намерению:
UPDATE #claims1 SET Date = LEFT(Date, 4) '0'
RTRIM(DATEPART(QUARTER, DATEFROMPARTS(LEFT(Date,4), RIGHT(Date,2), 1)));
Если вы просто хотите по какой-то причине обработать Q1, хорошо, просто добавьте:
WHERE RIGHT(RTRIM(Date),1) < 4;
- Пример бд<>скрипка<>
Ответ №2:
Если Date
столбец на самом деле представляет собой 6-значное целое число YYYYMM
, вы можете использовать для этого немного арифметики:
update #claims1
set Date = (Date / 100 * 100) 1
where Date % 100 <= 3;
(Date / 100 * 100)
усекает его, затем вы просто добавляете 1
Вы также можете выполнить все четыре четверти одновременно
update #claims1
set Date = (Date / 100 * 100) (Date % 100 / 4 * 3 1);
Ответ №3:
Это связано с тем, что тип данных вашей даты столбца является INT
и INT
с ним нельзя использовать тип данных LIKE
. Поэтому вместо этого преобразуйте столбец в VARCHAR
и выполните обновление. Подобный этому
update #claims1
set Date = left(CAST(Date AS VARCHAR(20)), len(CAST(Date AS VARCHAR(20))-2)) '01'
where RIGHT(CAST(Date AS VARCHAR(20)),2) in ('01','02','03');
Комментарии:
1. Получение «неправильного синтаксиса рядом с местом»
2. @2020db9, скобка отсутствовала. обновлено сейчас