Sql server 为只返回年份最后一位数字的邮戳创建十年

Sql server 为只返回年份最后一位数字的邮戳创建十年,sql-server,date,join,if-statement,Sql Server,Date,Join,If Statement,因此,我尝试在一种卡片上创建一个列作为过期日期。过期日期在条形码中编码为5号字符串,格式为ddmmy。问题是卡只返回一年的最后一位数字,我需要完整的日期。例如,如果条形码中与日期相对应的部分为19052,则到期日期可能为1992年5月19日、2002年5月19日或2012年5月19日 我的工作是提取卡片上运行测试的已知年份。我要做的是创建一个If语句,它表示如果过期日期的最后一位=batch.StartTime year的最后一位,那么过期年份=batch.StartTime year。否则,如

因此,我尝试在一种卡片上创建一个列作为过期日期。过期日期在条形码中编码为5号字符串,格式为ddmmy。问题是卡只返回一年的最后一位数字,我需要完整的日期。例如,如果条形码中与日期相对应的部分为19052,则到期日期可能为1992年5月19日、2002年5月19日或2012年5月19日

我的工作是提取卡片上运行测试的已知年份。我要做的是创建一个If语句,它表示如果过期日期的最后一位=batch.StartTime year的最后一位,那么过期年份=batch.StartTime year。否则,如果到期年的最后一位数字=0,batch.StartTime year的最后一位数字=9,则到期年=batch.StartTime year的前3位数字+到期日期的最后一位数字+10(对于下一个十年)。ELSE到期年份=批次的前3位数字。起始时间年份+到期的最后一位数字

问题是我的IF语句不起作用。我不断得到一个错误的语法错误的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

SELECT语句中不允许使用IF。你可以在陈述中用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。另外,请注意,IF中的SELECT关键字也是不需要的。

这应该适合您,一个更简单的解决方案,只需替换适当的名称即可。我将返回月、日、年和完整日期(这可能是您感兴趣的):


实际上我还没有对此进行测试,因此可能存在括号问题或其他小的语法问题,但实际上需要将IF语句转换为CASE-WHEN。要解决转换为INT的问题,请将整个语句包装为强制转换,例如:

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
我做了许多其他的简化修改,目的是从代码中消除一些不必要的混乱/复杂性,从而更容易看到它在做什么和调试问题。具体而言:

  • 将转换为右侧的最右侧字符向后拉的子字符串
  • 将整个字符串向后拉的子字符串已移除
  • 将强制转换为INT转换为字符串比较
  • 在最后一种情况下,不是将10添加到卡片日期,而是将11添加到批处理日期。(简单得多,结果也一样,对吧?)
祝你好运


-Michael

这适用于我的情况,但我仍然收到一个错误,说明无法将日期和月份转换为INT:“Msg 245,16级,状态1,第1行将varchar值“01/08/”转换为INT数据类型时,转换失败。”
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