SQL Server创建音乐表时mm:ss格式的songDuration字段应选什么数据类型?
SQL Server 歌曲时长字段选型方案
SQL Server 没有原生支持声明后自动以mm:ss格式输出的字段类型,以下两个方案可实现无需每次查询手动格式化的需求,适配ASP.NET Core Web应用场景:
方案一:TIME类型 + 持久化计算列(推荐,适配绝大多数歌曲场景)
适用时长范围不超过24小时的普通单曲,原始数据为时间类型,支持直接排序、时长计算,格式化字段自动维护:
CREATE TABLE musics ( id INT PRIMARY KEY IDENTITY(1,1), songName NVARCHAR(100) NOT NULL, -- 存储原始时长,精确到秒 songDuration TIME(0) NOT NULL CHECK (CAST(songDuration AS DATETIME) > '00:00:00'), -- 持久化计算列,插入/更新时自动生成mm:ss格式字符串,查询直接调用即可 songDurationText AS FORMAT(songDuration, 'mm\:ss') PERSISTED -- 其余字段按需补充 )
- 优势:原始数据结构化,做时长统计、排序无需额外转换,ASP.NET Core读取
songDurationText字段直接得到mm:ss格式字符串,无需二次处理。 - EF Core映射提示:给
songDurationText属性加上[DatabaseGenerated(DatabaseGeneratedOption.Computed)]注解即可,无需手动赋值。
方案二:INT存储总秒数 + 持久化计算列(适配超长音频场景)
如果存在时长超过24小时的串烧、合集类音频,用INT存储总秒数更灵活:
CREATE TABLE musics ( id INT PRIMARY KEY IDENTITY(1,1), songName NVARCHAR(100) NOT NULL, -- 存储总秒数,无24小时上限 songDurationSeconds INT NOT NULL CHECK (songDurationSeconds > 0), -- 自动生成mm:ss格式,如需支持小时可将格式调整为'HH\:mm\:ss' songDurationText AS CONCAT( FORMAT(songDurationSeconds / 60, '00'), ':', FORMAT(songDurationSeconds % 60, '00') ) PERSISTED -- 其余字段按需补充 )
- 优势:无时长上限,自定义格式化灵活度更高。
内容的提问来源于stack exchange,提问作者mert battal
相关产品推荐
相关产品推荐

