Ответ 1
попробуйте следующее:
SELECT CAST(CONVERT(CHAR(16), '2011-11-22 12:14',113) AS datetime)
У меня есть sql DateTime
(ms sql server) и вы хотите извлечь одну и ту же дату без секунд:
например 2011-11-22 12:14:58.000
, чтобы стать: 2011-11-22 12:14:00.000
Как я могу это сделать? Я думал использовать DATEADD
в сочетании с DATEPART
, но кажется очень склонным к ошибкам (помимо проблем с производительностью)
попробуйте следующее:
SELECT CAST(CONVERT(CHAR(16), '2011-11-22 12:14',113) AS datetime)
SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, 0, yourcolumn), 0) FROM yourtable
Это будет эффективно, если вы не хотите медленного преобразования между типами данных.
Дата и время необходимо тщательно и не преобразовывать как ТЕКСТ.
Мое личное решение:
CREATE FUNCTION [dbo].[fnDateTimeTruncated]
(
@datetime DATETIME
)
RETURNS DATETIME
AS
BEGIN
RETURN DATETIMEFROMPARTS ( year(@datetime), month(@datetime), day(@datetime), DATEPART(hh,@datetime), DATEPART(mi,@datetime), 0, 0)
END
Отредактировано:
Относительно http://blog.waynesheffield.com/wayne/archive/2012/03/truncate-a-date-time-to-different-part/, DateAdd имеет лучшую производительность. Благодаря t-clausen.dk
DECLARE @TheDate DATETIME
SET @TheDate = '2011-11-22 12:14:58.000'
DATEADD(mi, DATEDIFF(mi, 0, @TheDate), 0)
В запросах
/* ...all records in that minute; index-friendly expression */
WHERE TheDate BETWEEN DATEADD(mi, DATEDIFF(mi, 0, @TheDate), 0)
AND DATEADD(mi, DATEDIFF(mi, 0, @TheDate) + 1, 0)
Если миллисекунды отсутствуют, чем
DECLARE @dt datetime2 = '2011-11-22 12:14:58.000';
DECLARE @goalDt datetime2 = DATEADD(second,-DATEPART(second,@dt), @dt);
Чтобы удалить часть в миллисекундах, добавьте
SET @goalDt = DATEADD(millisecond,-DATEPART(millisecond,@goalDt ), goalDt dt);
С небольшим возиться, это, кажется, работает хорошо:
SELECT CAST(CONVERT(CHAR(17), bl.[time],113) AS varchar(17))
Полученный результат: 2011-11-22 12:14
Точный способ, которым я использую его в своем запросе как часть списка выбора:
,CAST(CONVERT(CHAR(17), bl.[time],113) AS varchar(17))
+ ' (UTC +0)' AS [TIME]
Дает мне результат: 15 декабря 2017 06:43 (UTC +0)
Чтобы округлить его:
DECLARE @TheDate DATETIME
SET @TheDate = '2019-1-2 12:14:58.400'
SELECT CAST(@TheDate AS SMALLDATETIME)
Чтобы просто усечь:
DECLARE @TruncTheDate DATETIME
SET @TruncTheDate = '2019-1-2 12:14:58.400'
SELECT DATEADD(mi, DATEDIFF(mi, 0, @TruncTheDate), 0)