Опускание миллисекунд в дате
Когда я выбираю из SQL Server, я хочу получить дату, но опускаю значение миллисекунды, и я хочу, чтобы это было как тип даты. Поэтому, если у меня есть значение 1/1/2009 1:23:11.923
, я хочу опустить миллисекунду, но сохранить тип даты, так что это будет значение 1/1/2009 1:23:11.000
(я знаю, что вы действительно не можете опустить значение миллисекунды с датой, просто хотите она равна нулю).
Есть ли функция в SQL Server для этого? Или мне нужно написать свою собственную функцию? Опять же, я не хочу, чтобы это был тип varchar
, но тип datetime
.
Ответы
Ответ 1
Если вы не хотите использовать преобразования строк, вот решение:
DECLARE @TheDate datetime, @Today datetime
SET @TheDate = GetDate()
SET @Today = DateAdd(dd, DateDiff(dd, 0, @TheDate), 0)
SELECT DateAdd(s, DateDiff(s, @Today, @TheDate), @Today)
Ответ 2
Используйте DATETIME2
, новый тип данных в SQL Server 2008, который поддерживает дробную точность:
SELECT
CONVERT(DATETIME2(0),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss]
, CONVERT(DATETIME2(1),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.f]
, CONVERT(DATETIME2(2),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.ff]
, CONVERT(DATETIME2(3),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.fff]
, CONVERT(DATETIME2(4),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.ffff]
, CONVERT(DATETIME2(5),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.fffff]
, CONVERT(DATETIME2(6),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.ffffff]
, CONVERT(DATETIME2(7),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.fffffff]
Конверсия будет округлена до ближайшего блока, например:
2014-09-04 09:35:47.0162993 as DATETIME2(4) ->
2014-09-04 09:35:47.0163
В качестве альтернативы, на SQL 2005 и eariler:
SELECT
original = GETDATE()
, [floor] = DATEADD(ms,-DATEPART(ms,GETDATE()),GETDATE())
, [ceiling] = DATEADD(ms,1000-DATEPART(ms,GETDATE()),GETDATE())
, [rounded] = DATEADD(ms,CASE WHEN DATEPART(ms,GETDATE()) < 500 THEN 0 ELSE 1000 END-DATEPART(ms,GETDATE()),GETDATE())
Это немного быстрее, чем преобразование в строковое представление и из него.
Ответ 3
Использование:
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(19), GETDATE(), 120))
Это:
CONVERT(VARCHAR(19), GETDATE(), 120)
... опускает миллисекунды, возвращая VARCHAR. Таким образом, вы CAST/CONVERT, что в DATETIME, чтобы работать с желаемым типом данных.
Смотрите эту ссылку для списка различных форматов даты и времени, с которыми вы можете работать.
Ответ 4
попробуйте это
declare @DATE datetime
select @DATE = '1/1/2009 1:23:11.923'
SELECT convert(datetime,CONVERT(char(35),@DATE,120))
или только с функциями даты
DECLARE @DATE DATETIME
SELECT @DATE = '1/1/2009 1:23:11.923'
SELECT DATEADD(SECOND, DATEDIFF(SECOND, 39000, @DATE), 39000)
Ответ 5
SELECT GETDATE(),
CONVERT(DATETIME, CONVERT(VARCHAR(MAX), GETDATE(), 120), 120)
Ответ 6
Вычитайте миллисекунду с даты. (Или добавить отрицательное значение миллисекунды)
SELECT DATEADD(ms, -DATEPART(ms, GETDATE()), GETDATE())
От SQL Server удаляет миллисекунды из datetime
Ответ 7
DATEADD(SECOND, DATEDIFF(SECOND, 0, < your datetime column >), 0)
Может потребоваться изменить значение 0 на что-то еще, чтобы предотвратить ошибку переполнения. Не нужно иметь SQL Server под рукой, чтобы проверить.
Хотя этот метод не кажется интуитивным с первого взгляда, посмотрите здесь на обоснование: http://www.karaszi.com/SQLServer/info_datetime.asp#GettingRidOfTimePortion
ИЗМЕНИТЬ: см. комментарии