我使用CAST
语法将select CAST([time] as time) as [CSTTime]
字段强制转换为时间。
2015-03-19 00:00:00.000
日期时间
03:05:36.0000000
现在输出:时间
HH:MM:SS
我只需要HH:MM:SS
而不是毫秒或0000
如何过滤或将其投射为精确的int
格式。
答案 0 :(得分:26)
Time
未在SQL Server中以显示格式存储
因此,从用户角度来看,您可以说没有格式。
当然,由于它具有存储格式,因此不完全准确,但作为普通用户,您无法真正使用它。
对于所有日期和时间数据类型都是如此:
Date
,DateTimeOffset
,DateTime2
,SmallDateTime
,DateTime
和Time
。
如果您需要格式,则无需转换为time
,而是转换为char
。使用Convert
获取您需要的char
:
SELECT CONVERT(char(10), [time], 108) as CSTTime
以下是您感兴趣的一些背景数据:
在2000年发表的this article中,作者深入解释了SQL Server如何处理日期和时间。我怀疑在2000年到2015年间,SQL Server在内部存储date
,time
和datetime
值的方式是否发生了重大变化。
以下是相关引用,如果您不想阅读全部内容:
那么SQL Server如何在内部存储日期?它使用8个字节来存储日期时间值 - 前4个用于日期,第2个用于存储日期时间值。 SQL Server可以将两组4个字节解释为整数 ........
........
SQL Server将时间的第二个整数存储为午夜后的时钟周期数。第二个包含300个刻度,因此刻度等于3.3毫秒(ms)。
因为time
实际上存储为4字节整数,所以它实际上没有格式作为数据类型的组成部分。
您可能还想查看this article以获取有关代码示例的更详细说明。
答案 1 :(得分:9)
您可以使用CAST
实现它,只需使用以下简单的TIME(0)
数据类型:
SELECT CAST('2015-03-19 01:05:06.289' AS TIME(0))
<强>输出:强>
01:05:06
答案 2 :(得分:1)
SQL Server 2008:
select cast(MyDate as time) [time] from yourtable
早期版本:
select convert(char(5), MyDate , 108) [time] from yourtable
其他选项:
SELECT CONVERT(VARCHAR(20), GETDATE(), 114)
从datetime 没有毫秒堆栈获取时间的最简单方法是:
SELECT CONVERT(time(0),GETDATE())
小时和分钟
SELECT substring(CONVERT(VARCHAR, GETDATE(), 108),0,6) AS Time
答案 3 :(得分:0)
以上所有答案都是正确的,您也可以在2012+年作为参考:
DECLARE @date datetime2 = SYSDATETIME()
SELECT FORMAT(@date, N'hh:mm:ss', N'en-US')
SELECT TIMEFROMPARTS(DATEPART(hh, @date), DATEPART(mm, @date), DATEPART(ss, @date),0,0)
FORMAT()允许您选择定界符和culture。它将返回NVARCHAR数据类型。
TIMEFROMPARTS()允许您选择精度,并且在您希望以任何方式舍入时间戳时都非常方便,因为它将内部的所有值都视为整数。它将返回TIME数据类型。