如何在不创建变量的前提下将datetime2列转换为int类型
无自定义变量实现datetime2列转int的方案
所有实现逻辑均可通过SQL Server内置函数的嵌套表达式完成,全程无需通过DECLARE语句创建自定义会话变量,可直接嵌入查询、更新、视图定义等场景使用。
常用转换场景实现
1. 转换为yyyyMMddHHmmss格式的整数
这种格式是日常做时间排序、存储纯数字时间标识最常用的类型,性能较优的写法为:
-- 替换YourDatetime2Column为实际表中的datetime2列名,YourTableName为实际表名 SELECT CONVERT(INT, CONVERT(CHAR(8), YourDatetime2Column, 112) -- 取yyyyMMdd部分 + REPLACE(CONVERT(CHAR(8), YourDatetime2Column, 108), ':', '') -- 取HH:mm:ss并去掉冒号 ) AS DatetimeAsInt FROM YourTableName
针对示例值2020-03-03 10:17:26.0000000,上述语句计算得到的int结果为20200303101726。
如果需要兼容更高精度(如包含秒级小数),可以调整字符串拼接的格式串,直接将完整时间数字串转换为int即可,全程无需额外变量介入。
2. 转换为Unix时间戳格式的整数
如果需求是对齐Unix时间戳格式,可按精度直接写计算表达式,常用分秒级、毫秒级两种:
- 秒级时间戳(2038年之前的时间数值可正常放入int类型存储范围):
SELECT DATEDIFF(SECOND, '1970-01-01 00:00:00', YourDatetime2Column) AS UnixTimestampSec FROM YourTableName
- 毫秒级时间戳:
SELECT -- 毫秒数值整体范围超过int存储上限时,可根据业务需求截断精度后转int,或调整为秒级计算 CAST(DATEDIFF_BIG(MILLISECOND, '1970-01-01 00:00:00', YourDatetime2Column) AS INT) AS UnixTimestampMs FROM YourTableName
针对示例值2020-03-03 10:17:26.0000000,上述秒级时间戳语句计算得到的int结果为1583216246。
实际扩展用法
上述计算表达式为纯临时计算逻辑,不会在数据库中创建持久化自定义变量,完全符合无变量的实现要求。如果需要把转换后的int值回写到表中,可把上述表达式直接放到UPDATE语句的赋值段:
UPDATE YourTableName SET IntTimeColumn = CONVERT(INT, CONVERT(CHAR(8), YourDatetime2Column, 112) + REPLACE(CONVERT(CHAR(8), YourDatetime2Column, 108), ':', '') )
内容的提问来源于stack exchange,提问作者user12571054
相关产品推荐
相关产品推荐

