Выберите запрос, который будет смотреть на цифры слева и справа от тире и выполнить выборку на основе обоих значений - PullRequest
0 голосов
/ 24 января 2019

Вот пример того, как будут выглядеть значения столбца в моей таблице 18-0267, 19-0001, 19-0002, 19-SHOP

Итак, что мне нужно сделать, это сначала разделитьцифры слева от «-» и посмотреть, действительно ли эти цифры относятся к текущему году, например, 19 = 2019 или 18 = 2018.

После этого мне нужно получить символы справа от'-' и проверьте, действительно ли они равны '% [0,9]%', и если они есть, я бы хотел выбрать ордер Top 1 по DESC, но это верхнее значение должно вступить в силу с текущего года доцифры левой стороны.

Я думал, что у меня это было из запроса ниже, но это было до тех пор, пока я не понял, что я не проверял цифры слева от «-», чтобы убедиться, что верхнее значение от текущего года

Так что из чисел в приведенном выше примере я хотел бы вернуть значение 19-0002, но на самом деле я просто хочу вернуть 0002, и сейчас запрос возвращает значение 18-0267, а я получаю 0267.

Любая помощь приветствуется, спасибо

SELECT TOP 1
  RIGHT(Name, CHARINDEX('-', REVERSE(Name)) - 1) AS 'Name'
FROM Job
WHERE RIGHT(Name, CHARINDEX('-', REVERSE(Name)) - 1) LIKE '%[0-9]%'
ORDER BY Name DESC

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вот версия, которая ограничивается на основе двух первых символов, являющихся текущим двухзначным годом:

select TOP 1 RIGHT(job.Name, CHARINDEX('-', REVERSE(job.Name)) - 1) name
  from job
 where job.name like left(CONVERT(VARCHAR(6), GETDATE(), 12),2) + '-[0-9]%'
 order by 1 desc;

Использование сортировки по job.name в порядке убывания не будет работать, если у вас есть будущие годы врабочий стол.

0 голосов
/ 24 января 2019

Проблема в том, к чему относится name.Попробуйте это:

SELECT TOP 1 RIGHT(Name, CHARINDEX('-', REVERSE(Name)) - 1) AS New_Name
FROM Job j
WHERE RIGHT(Name, CHARINDEX('-', REVERSE(Name)) - 1) LIKE '%[0-9]%'
ORDER BY j.Name DESC;

Ваш псевдоним с именем Name был перепутан со столбцом с именем Name.

Если вы хотите убедиться, что два правильных столбца относятся к текущему году, то вам нужно включить это в предложение WHERE:

SELECT TOP 1 RIGHT(Name, CHARINDEX('-', REVERSE(Name)) - 1) AS New_Name
FROM Job j
WHERE RIGHT(Name, CHARINDEX('-', REVERSE(Name)) - 1) LIKE '%[0-9]%' AND
      DATENAME(YEAR, GETDATE()) LIKE '__' + LEFT(NAME, 2) 
ORDER BY j.Name DESC;
...