SQL中如何将mm.yyyy格式的float值转换为指定格式标准日期
float存储的mm.yyyy格式值转标准日期方案
用float类型存储年月值存在天然的浮点精度风险,比如部分值存入后可能出现1.2022实际存储为1.2021999999999的偏差,转换前建议先转成固定精度类型再做处理。
示例原始变量声明:
Declare @col float =01.2022
转换逻辑统一取对应月份的第一天作为日期值,可直接输出要求的两种格式。
转换代码(适配SQL Server)
-- 原始变量 Declare @col float =01.2022 -- 精度预处理+拆分年、月 DECLARE @fixedVal DECIMAL(6,4) = CAST(@col AS DECIMAL(6,4)) -- 转固定精度消除浮点误差 DECLARE @year INT = CAST((@fixedVal - FLOOR(@fixedVal)) * 10000 AS INT) -- 提取年份 DECLARE @month INT = CAST(FLOOR(@fixedVal) AS INT) -- 提取月份 DECLARE @firstDay DATE = DATEFROMPARTS(@year, @month, 1) -- 组装当月第一天的日期值 -- 格式1:YYYY-MM-DD 输出 SELECT CONVERT(VARCHAR(10), @firstDay, 23) AS ymd_with_dash -- 格式2:YYYY/MM/DD 输出 SELECT REPLACE(CONVERT(VARCHAR(10), @firstDay, 23), '-', '/') AS ymd_with_slash
低版本SQL Server不支持
DATEFROMPARTS的话,可以直接用字符串拼接实现,不需要依赖日期函数:Declare @col float =01.2022 DECLARE @fixedVal DECIMAL(6,4) = CAST(@col AS DECIMAL(6,4)) DECLARE @year INT = CAST((@fixedVal - FLOOR(@fixedVal)) * 10000 AS INT) DECLARE @month INT = CAST(FLOOR(@fixedVal) AS INT) SELECT CONCAT(@year, '-', RIGHT('0'+CAST(@month AS VARCHAR(2)),2), '-01') AS ymd_with_dash, CONCAT(@year, '/', RIGHT('0'+CAST(@month AS VARCHAR(2)),2), '/01') AS ymd_with_slash
输出结果
两种写法的执行结果完全一致:
- YYYY-MM-DD格式:
2022-01-01 - YYYY/MM/DD格式:
2022/01/01
补充建议:业务层面尽量不要用float类型存储日期、时间类结构化值,很容易出现精度丢失、转换逻辑复杂的问题,直接用DATE类型存储、或者用INT类型存
yyyyMM格式的整数值(比如202201代表2022年1月),稳定性会高很多。
内容的提问来源于stack exchange,提问作者ajay
相关产品推荐
相关产品推荐

