Как привести время ко времени
Я кастую DateTime
поле времени, используя CAST
Синтаксис.
select CAST([time] as time) as [CSTTime]
DateTime2015-03-19 00:00:00.000
Текущий вывод: Время03:05:36.0000000
Мне нужно только HH:MM:SS
а не миллисекунды или 0000
Как отфильтровать или привести к точному HH:MM:SS
Формат.
3 ответа
Time
не сохраняется с его форматом отображения в SQL Server.
Поэтому, с точки зрения пользователя, вы можете сказать, что он не имеет формата.
Конечно, это не совсем точно, поскольку у него есть формат хранения, но, как обычный пользователь, вы не можете его использовать.
Это верно для всех типов данных даты и времени: Date
, DateTimeOffset
, DateTime2
, SmallDateTime
, DateTime
а также Time
,
Если вам нужен формат, вам не нужно приводить time
но к char
, использование Convert
чтобы получить char
тебе нужно:
SELECT CONVERT(char(10), [time], 108) as CSTTime
Вот некоторые справочные данные, если вы заинтересованы:
В этой статье, опубликованной в 2000 году, автор подробно объясняет, как SQL Server обрабатывает даты и время. Я сомневаюсь, что что-то существенное изменилось между 2000 и 2015 годами в способе хранения SQL Server date
, time
а также datetime
ценности внутри.
Вот соответствующие цитаты, если вы не хотите читать все это:
Так как же SQL Server хранит даты внутри? Он использует 8 байтов для хранения значения datetime - первые 4 для даты и вторые 4 для времени. SQL Server может интерпретировать оба набора по 4 байта как целые числа.
........
........
SQL Server хранит второе целое число для времени как число тактов после полуночи. Секунда содержит 300 тиков, поэтому тик равен 3,3 миллисекунды (мс).
поскольку time
на самом деле хранится как 4-байтовое целое число, он действительно не имеет формат как неотъемлемая часть типа данных.
Возможно, вы также захотите проверить эту статью для более подробного объяснения с примерами кода.
Вы можете достичь этого с CAST
просто простое использование TIME(0)
Тип данных в следующем:
SELECT CAST('2015-03-19 01:05:06.289' AS TIME(0))
ВЫХОД:
01:05:06
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
Все ответы выше верны, просто для справки в 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 () позволяет выбрать разделитель и культуру. Он вернет тип данных NVARCHAR.
TIMEFROMPARTS () позволяет вам выбрать точность и удобна, когда вы хотите округлить вашу метку времени любым способом, так как она обрабатывает все значения внутри как целые числа. Он вернет тип данных TIME.