Создание десятилетия для Datestamp, которая возвращает только последнюю цифру года - PullRequest
0 голосов
/ 18 июля 2011

Итак, я пытаюсь создать столбец с указанием срока годности на карте. Дата истечения срока действия закодирована в штрих-коде в виде 5-значной строки в формате ddmmy. Проблема в том, что карта возвращает только последнюю цифру года, а мне нужна вся дата. Например, если часть штрих-кода, соответствующая дате, равна 19052, то датой истечения срока может быть 19 мая 1992 г., 19 мая 2002 г. или 19 мая 2012 г.

Моя задача заключалась в том, чтобы определить известный год даты запуска теста на карточке. То, что я пытаюсь сделать, это создать оператор If, который говорит, ЕСЛИ последняя цифра даты истечения срока действия = последняя цифра партии. StartTime year THEN год истечения срока действия = batch.StartTime year. ИЛИ ЕСЛИ последняя цифра года истечения срока действия = 0 и последняя цифра партии. Начальный год = 9 ТО год выпуска = первые 3 цифры партии. Начальный год + последняя цифра даты окончания срока действия + 10 (для следующего десятилетия). ELSE год истечения срока действия = первые 3 цифры партии. Год начала года + последняя цифра срока годности.

Проблема в том, что мое заявление ЕСЛИ не сработает. Я продолжаю получать неправильную синтаксическую ошибку IF. Также, если я пытаюсь увидеть результаты только для каждого условия в отдельности, это говорит мне, что он не может преобразовать день и месяц (с символом «/» между) в INT, даже если я объявляю их как символы. Вот код:

SELECT

(CAST(SUBSTRING(tbl_CardIdentification.CardId, 11,2) + '/' + --this is the day
SUBSTRING(tbl_CardIdentification.CardId, 13,2) + '/' AS CHAR(6)) + -- this is the month

(IF 
(SUBSTRING(tbl_CardIdentification.CardId, 15,1) =
(SUBSTRING(CAST(DATEPART(YY, tbl__Batch.Start) AS CHAR(4)), 4,1)))
SELECT SUBSTRING(CAST(DATEPART(YY, tbl_Batch.Start) AS CHAR(4)),1,4)

ELSE IF  
(CAST(SUBSTRING(tbl_CardIdentification.CardId, 15,1) AS INT)) = 0 AND
(CAST(SUBSTRING(CAST(DATEPART(YY, tbl_Batch.Start) AS CHAR(4)), 4,1) AS INT)) = 9
SELECT (CAST((SUBSTRING(CAST(DATEPART(YY, tbl__Batch.Start) AS CHAR(4)), 1,3) +
SUBSTRING(tbl_CardIdentification.CardId, 15,1)) AS INT) + 10)

ELSE SELECT
(SUBSTRING(CAST(DATEPART(YY, tbl__Batch.Start) AS CHAR(4)), 1,3) +
SUBSTRING(tbl_CardIdentification.CardId, 15,1))

AS Card_Expiration

FROM

tbl_LoadProcess

JOIN tbl_Batch ON
tbl_Batch.LoadProcessSid = tbl_LoadProcess.LoadProcessSid

JOIN tbl_CardIdentification ON
tbl_CardIdentification.LoadProcessSid = tbl_LoadProcess.LoadProcessSid

Ответы [ 3 ]

1 голос
/ 18 июля 2011

IF не допускается в операторе SELECT. Вы можете заменить его на CASE в своем заявлении. Это будет выглядеть так

SELECT

(CAST(SUBSTRING(tbl_CardIdentification.CardId, 11,2) + '/' + --this is the day
SUBSTRING(tbl_CardIdentification.CardId, 13,2) + '/' AS CHAR(6)) + -- this is the month

CASE
WHEN
  (SUBSTRING(tbl_CardIdentification.CardId, 15,1) =
  (SUBSTRING(CAST(DATEPART(YY, tbl__Batch.Start) AS CHAR(4)), 4,1)))
THEN
  SUBSTRING(CAST(DATEPART(YY, tbl_Batch.Start) AS CHAR(4)),1,4)

WHEN
  (CAST(SUBSTRING(tbl_CardIdentification.CardId, 15,1) AS INT)) = 0 AND
  (CAST(SUBSTRING(CAST(DATEPART(YY, tbl_Batch.Start) AS CHAR(4)), 4,1) AS INT)) = 9
THEN
  (CAST((SUBSTRING(CAST(DATEPART(YY, tbl__Batch.Start) AS CHAR(4)), 1,3) +
  SUBSTRING(tbl_CardIdentification.CardId, 15,1)) AS INT) + 10)

ELSE
  (SUBSTRING(CAST(DATEPART(YY, tbl__Batch.Start) AS CHAR(4)), 1,3) +
  SUBSTRING(tbl_CardIdentification.CardId, 15,1))
END

AS Card_Expiration

FROM

tbl_LoadProcess

JOIN tbl_Batch ON
tbl_Batch.LoadProcessSid = tbl_LoadProcess.LoadProcessSid

JOIN tbl_CardIdentification ON
tbl_CardIdentification.LoadProcessSid = tbl_LoadProcess.LoadProcessSid

Оператор CASE включает в себя другие ключевые слова, в том числе WHEN, THEN, ELSE и END. Также обратите внимание, что ключевые слова SELECT в вашем IF также не нужны.

0 голосов
/ 18 июля 2011

Я на самом деле не проверял это, поэтому могут быть проблемы с круглыми скобками или другие незначительные синтаксические проблемы, но вам, по сути, необходимо преобразовать выражение IF в CASE WHEN. Чтобы решить проблему преобразования в INT, оберните весь оператор в CAST, например ::10000

CAST(CASE
  WHEN 
    SUBSTRING(tbl_CardIdentification.CardId, 15,1) = 
    RIGHT(CAST(DATEPART(YY, tbl__Batch.Start) AS CHAR(4)), 1)
  THEN
    CAST(DATEPART(YY, tbl_Batch.Start) AS CHAR(4))

  WHEN
    CAST(SUBSTRING(tbl_CardIdentification.CardId, 15,1) AS INT) = 0
    AND RIGHT(CAST(DATEPART(YY, tbl__Batch.Start) AS CHAR(4)), 1) = '9'

  THEN
    CAST(DATEADD(yy, 11, tbl__Batch.Start) AS CHAR(4))

  ELSE
    SUBSTRING(CAST(DATEPART(YY, tbl__Batch.Start) AS CHAR(4)), 1,3) +
    SUBSTRING(tbl_CardIdentification.CardId, 15,1)

  END AS CHAR(4)) AS Card_Expiration

Я сделал ряд других упрощающих модификаций, цель которых состояла в том, чтобы устранить некоторые ненужные помехи / сложности в коде, облегчая тем самым понимание того, что он делает, и устранение проблем. В частности:

  • SUBSTRING, которые отбрасывают крайний правый символ, преобразованный в RIGHT
  • SUBSTRING, которые возвращают всю удаленную строку
  • Преобразование CAST в INT в сравнение строк
  • В последнем случае вместо добавления 10 к дате карты добавляется 11 к дате пакета. (Гораздо проще и тот же результат, верно?)

Удачи!

-Michael

0 голосов
/ 18 июля 2011

Это должно работать для вас, гораздо более простое решение, просто замените соответствующие имена.Я возвращаю месяц, день, год и полную дату (что, вероятно, вас интересует):

DECLARE @StartDate DATETIME
DECLARE @InputDate NCHAR(5)

SELECT @StartDate = '02/01/2000'
SELECT @InputDate = '19052'

SELECT LEFT(@InputDate, 2) AS MyDay, SUBSTRING(@InputDate, 3,2) AS MyMonth,
    LEFT(DATEPART(YEAR, @StartDATE),LEN(DATEPART(YEAR, @StartDate))-1) + RIGHT(@InputDate,1) AS MyYear, 
    CAST(SUBSTRING(@InputDate,3,2) + '/'+LEFT(@InputDate, 2) + '/'+
        LEFT(DATEPART(YEAR, @StartDATE),LEN(DATEPART(YEAR, @StartDate))-1) + RIGHT(@InputDate,1) AS DATETIME) AS FullDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...