Sql server 为只返回年份最后一位数字的邮戳创建十年
因此,我尝试在一种卡片上创建一个列作为过期日期。过期日期在条形码中编码为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。代码如下: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。否则,如
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