如何在 sql 中将前导 0 添加到整数?



日期和时间值(分别)作为整数存储。我现在想把它们转换成datetime数据类型到一个新的列,但是在处理时间时遇到了麻烦。

我的第一个想法是这样做(我可以处理日期,所以在这个例子中,我只是使用一个虚拟日期):

SET new_column = CAST(CONCAT('2020-01-01T', 
date_column / 10000, ':', 
date_column % 10000 / 100, ':', 
date_column % 100) AS DATETIME) 

问题是CAST期望的格式完全是'yyyy-mm-ddThh:mm:ss',但计算有时可能只返回一个数字,而不是部分时间所需的两个数字。

例如,上午9点后一分钟的时间将产生字符串'2020-01-01T9:1:0',尽管需要'2020-01-01 t9:01:00'。

是否有一种有效的方法来添加前导0 ?

编辑:date_column包含以hhmmss格式表示时间的整数值。例如,上午10点存储为100000,上午9点后一分钟存储为90100。

我知道将时间/日期编码为整数是愚蠢的。这是遗留原因,我当前的任务是修复它;)

您需要在中加上一个0来处理个位数的输出。不幸的是,T-SQL没有PADRPAD函数,因此您必须手动执行:

SET new_column = CONVERT(datetime,
CONCAT('2020-01-01T', 
RIGHT(CONCAT('0', date_column / 10000),2)
+ ':'
+ RIGHT(CONCAT('0', date_column % 10000 / 100), 2)
+ ':'
+ RIGHT(CONCAT('0', date_column % 100), 2)));
  • db&lt例子;在小提琴

不用担心创建要转换的字符串-将时间转换为秒,然后将其添加到您的日期:

Declare @myDate int = 20220711
, @myTime int = 182233;
Select cast(@myDate As char(10))
, @myTime / 10000 * 60 * 60
, @myTime % 10000 / 100 * 60
, @myTime % 100
, dateadd(second, (@myTime / 10000 * 60 * 60) + (@myTime % 10000 / 100 * 60) + (@myTime % 100), cast(@myDate As char(10)))

最新更新