为什么SQL Server 2022在格式化time与 datetime时的行为不同?
我正在做一个工作相关的项目,最初打算把时间存放在表中的 datetimeoffset 字段里。我只关心时间,不在乎日期,所以打算用一个占位日期。之所以这样想,是因为我过去对TIME数据类型有过问题,但当时以为现在应该没问题,结果现在又有问题。于是我决定做个测试。
最终,我需要的数据格式是 h:mmt,也就是说9:15 AM应该显示为9:15a。
下面是我的测试:
declare @time time = '09:00',
@date datetime = getdate();
select FORMAT(@time, 'h:mmt'), FORMAT(@date, 'h:mmt')
现在,datetime变量基本符合我的预期(需要把它包在LOWER() 函数里再处理),一切都没问题。时间变量却返回null。
为了让它输出结果,我必须去掉“t”,并把冒号用 \ 转义,这样就得到9:00。
因此我的问题是:
- 为什么SQL Server 2022不支持在
TIME的格式中使用t? - 为什么对
TIME数据类型需要对冒号进行转义,而对DATETIME数据类型却不需要? - 在SQL Server 2022中,是否有其他函数能够在
TIME数据类型上给出我想要的格式(h:mmt)?我知道可以通过其他方式实现目标,但我希望尽量接近“一站式解决方案”。 - 为什么SQL Server 2022对
TIME数据类型的处理与DATETIME有如此不同?
解决方案
时间数据类型被视为TimeSpan。AM/PM指示符(t和 tt)不支持TimeSpan风格的格式化——它们只有在值是完整的日期+时间类型(datetime、datetime2等)时才起作用。我确实把这个做法调通了:
DECLARE @myTime time = '9:00';
SELECT LOWER(FORMAT(CAST(@myTime AS datetime), 'h:mmtt')) AS FormattedTime;
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。