如何解决SQL Case始终使用第一种情况?
所以我有一个SQl-Case,它询问整数%3600是否大于10 ...如果不是,应该 concat()前面有一个“ 0” ...与其他情况一样,它们的字义已更改...应该代表一个时间,
它应该导致类似这样的结果:
Int_Sek
00:43:23
09:03:45
34:03:09
但是这样结束:
Int_Sek
0:43:23
4:3:45
23:3:9
所以它总是使用第一种情况,我不知道为什么...有人知道吗?
Select concat(
case
when Int_Sek / 3600 <= 9 then concat('0',floor(Int_Sek / 3600))
when Int_Sek / 3600 >= 10 then floor(Int_Sek / 3600) END,':',case
when (Int_Sek % 3600) / 60 <= 9 then concat ('0',(Int_Sek % 3600) / 60)
when (Int_Sek % 3600) / 60 >= 10 then floor((Int_Sek % 3600) / 60) END,case
when ((Int_Sek % 3600) % 60) % 60 <= 9 then concat('0',((Int_Sek % 3600) % 60) % 60)
when ((Int_Sek % 3600) % 60 )% 60 >= 10 then floor(((Int_Sek % 3600) % 60) % 60) END) as "Column A",from Table A
解决方法
如果您使用的是SQL Server,为什么不直接转换为time
?
select dateadd(second,int_sek,convert(time,0))
您可以将结果time
格式化为字符串。
其他数据库提供类似的功能。
您的代码有什么问题?考虑您的第一个case
表达式:
case when Int_Sek / 3600 <= 9
then concat('0',floor(Int_Sek / 3600))
when Int_Sek / 3600 >= 10
then floor(Int_Sek / 3600)
end,
第一个then
返回一个字符串。第二个返回整数。整体表达式返回什么?它返回一个整数。因此,前导'0'
丢失了。解决此问题的方法有很多种,但我想最典型的方法是:
case when Int_Sek / 3600 <= 9
then concat('0',floor(Int_Sek / 3600))
when Int_Sek / 3600 >= 10
then cast(floor(Int_Sek / 3600) as varchar(255))
end,
请注意,我也建议将其简化为:
concat(case when Int_Sek / 3600 <= 9 then '0' else '' end,floor(Int_Sek / 3600),':',. . .
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。