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 触发器函数中获取表名? [关闭]

sql server 触发器 从一个表添加到另个表是否两个表对应的字段必须相同呢

SQL Server 函数和触发器的问题

学习 SQL Server :内置函数,触发器

sqlserver 的写法

使用 DBContext 将 SQL Server 数据库与时间触发的 Azure 函数连接起来