IIF 条件问题

IIF Condition Ques

谁能解释一下这种情况,因为我得到的时间数据有误,例如:我预计 sch 出发时间为 15.10,但我得到的是 15.01

[Sch Dep Time] = IIF(DATEPART(Hour,[Journey and Details.schdeptime]) < 10 AND DATEPART(Minute,[Journey and Details.schdeptime]) < 10,
                 ('0' + DATEPART(Hour,[Journey and Details.schdeptime]) + ':0' + DATEPART(Minute,[Journey and Details.schdeptime])),
                     IIF(DATEPART(Hour,[Journey and Details.schdeptime]) < 10,
                         ('0' + DATEPART(Hour,[Journey and Details.schdeptime]) + ':' + DATEPART(Minute,[Journey and Details.schdeptime])),
                         (DATEPART(Hour,[Journey and Details.schdeptime]) + ':0' + DATEPART(Minute,[Journey and Details.schdeptime]))))

更新

我突然想到 [Sch Dep Time] 应该包含存储在 [Journey and Details.schdeptime] 中的 dataTime 值的时间分量,分辨率为一分钟。为此,您不需要搞乱特定的日期部分和字符串连接,您所要做的就是使用 convert:

[Sch Dep Time] = CONVERT(char(5), [Journey and Details.schdeptime], 108)

108 样式 returns hh:mm:ss(24 小时),通过使用 char(5),您只需要该字符串的前 5 个字符 - hh:mm

第一个版本

你把事情想得太复杂了。尝试使用旧的 right('00' + val, 2) 技巧:

[Sch Dep Time] = RIGHT('00' + CAST(DATEPART(Hour,[Journey and Details.schdeptime]) AS VARCHAR(2)), 2) + ':' +
                 RIGHT('00' + CAST(DATEPART(Minute,[Journey and Details.schdeptime]) AS VARCHAR(2)), 2)

解释:

您首先将前导零连接到您想要的字符串。
假设您有一个表示数字的字符串,该数字必须始终包含 4 位数字,但它可能是 1234 或 0003 - 因此您首先执行 '0000' + @YourNumber.
然后,你使用 RIGHT 来 trim 关闭任何不需要的零 - 假设你现在有 000023,但你想要 0023 - 你做 RIGHT('000023', 4) 得到最后一个4 个字符。