SQL中dateformatting的hh和HH有什么区别?

时间:2017-11-21 08:55:58

标签: sql

格式化我的时间时,我会得到不同的结果,具体取决于使用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')

1 个答案:

答案 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