SQL Server 触发 CAST 函数
Posted
技术标签:
【中文标题】SQL Server 触发 CAST 函数【英文标题】:SQL Server Trigger CAST function 【发布时间】:2017-07-10 23:51:31 【问题描述】:我能够创建一个 INSERT 触发器,该触发器从一个表中获取出生日期并完美地转换为等效表
SELECT @DateOfBirth = CAST(INSERTED.DOBIRTH AS DATETIME)
FROM INSERTED
但是现在,我正在编写一个 UPDATE 触发器,并且我想更新 ORIGINAL 表;如何将该出生日期转换回 7 位整数值?
【问题讨论】:
你犯了触发器的第一个错误:INSERTED
可以有很多行。您刚刚在代码中选择了任意一行。反正。请指出 7 位数值应采用何种格式。您要排除日期的哪一部分。我们应该猜吗? (您需要 8 位数字来描述日期)
1968010 是一个出生日期。
那是一月零日吗?
假设这是 SQL Server,它甚至不会强制转换为日期时间,即使您正确执行并使用 CONVERT
。请解释该数据的格式是什么?通过检查,它似乎缺少数据。如果 1968 年是年,你如何用三位数来描述一个两位数的月份和一个数位的日期?
请阅读this,了解一些改进问题的技巧。
【参考方案1】:
7 位日期格式为 YYYYDDD,即一年中的年和日 (1-365[6])。 这是一种方法:
SELECT CAST(YEAR(@DateOfBirth) AS varchar) +
RIGHT('000' +
CAST(DATEDIFF(DAY, CAST(YEAR(@DateOfBirth) AS varchar) + '-01-01', @DateOfBirth)+1 AS varchar)
, 3)
我取日期的年份部分并连接自年初以来的天数。我还在 100 之前的几天用 0 填充左侧。
所以 2017-01-01 变成 2017001 并且 2017-12-31 变成 2017365。 p>
【讨论】:
@JohnEdwardLaw 对于整个问题,您没有解释日期格式。对于您的下一个问题,请包含此重要信息 好吧,我本来打算补充一下,但鉴于答案是以“7 位日期格式为 YYYYDDD”的形式给出的,并且我能够快速使用它,所以我无法抢在回答的人之前。下一次,我将努力确保将其包含在前面。【参考方案2】:我不知道 7 位整数是什么。您可以使用以下方法将其转换为整数:
select convert(int, format(dob, 'yyyyMMdd'))
或者,如果您愿意:
select year(dob) * 10000 + month(dob) * 100 + day(dob)
【讨论】:
以上是关于SQL Server 触发 CAST 函数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 触发器函数中获取表名? [关闭]