格式化我的时间时,我会得到不同的结果,具体取决于使用hh或HH。
有人能告诉我为什么会这样吗? 使用以下代码会出现此问题,在第二个结果上返回NULL。
declare @TIMEPART time = getdate()
declare @datetime datetime2(7) = getdate()
select format(@timepart, 'hh\:mm'), format(@timepart, 'HH\:mm'), format(@datetime, 'hh\:mm'), format(@datetime, 'HH\:mm')
答案 0 :(得分:0)
HH:mm格式不是time数据类型的有效转换,对于格式(时间,时间格式)函数,它不是正确的语法。因此,format函数返回null。 HH:mm是datetime数据类型的24小时时钟的转换类型,但与time数据类型不兼容,因为时间数据类型已经是24小时时钟格式(不知道为什么会这样,但我认为这是因为时间数据类型可以做的不仅仅是表示24小时的时间)。 AM \ PM格式类型hh:mm仅对datetime数据类型有效,并且对于时间它将仅返回24小时时间,因为这是所有时间数据类型都可以返回的。如果输入值数据类型是时间,则必须将时间转换为日期时间,以便显示AM / PM格式,如下所示。
declare @TIMEPART time = '21:20:20.0570000'
declare @datetime datetime2(7) = '21:20:20.0570000'
select format(@timepart, 'hh\:mm'), format(convert(datetime,@timepart), 'hh:mm'), format(@datetime, 'hh\:mm'), format(@datetime, 'HH\:mm')
如果您仍希望第二列的数据类型为时间,则必须转换回时间
cast(format(convert(datetime,@timepart), 'hh:mm') as time)
然而,在此示例中,时间将是上午9:20而不是下午9:20,因为时间仅存储为小时的0到23值。这是一个很好的例子,为什么总是尝试以0-23小时格式返回任何时间值。如果您确实需要以12小时格式显示时间,最好将其转换为varchar。
convert(varchar(15), format(convert(datetime,@timepart), 'hh:mm'))
另外需要注意的是,对于日期时间,不需要格式为\,例如
format(@datetime, 'hh\:mm')
和
format(@datetime, 'hh:mm')
将返回相同的值。但是,时间数据类型函数需要\。
format(@timepart, 'hh\:mm')
将返回hh:mm时间,但
format(@timepart, 'hh:mm')
将返回null