日期和时间值(分别)作为整数存储。我现在想把它们转换成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没有PAD
或RPAD
函数,因此您必须手动执行:
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<例子;在小提琴
不用担心创建要转换的字符串-将时间转换为秒,然后将其添加到您的日期:
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)))