Опускание миллисекунд в дате

Когда я выбираю из SQL Server, я хочу получить дату, но опускаю значение миллисекунды, и я хочу, чтобы это было как тип даты. Поэтому, если у меня есть значение 1/1/2009 1:23:11.923, я хочу опустить миллисекунду, но сохранить тип даты, так что это будет значение 1/1/2009 1:23:11.000 (я знаю, что вы действительно не можете опустить значение миллисекунды с датой, просто хотите она равна нулю).

Есть ли функция в SQL Server для этого? Или мне нужно написать свою собственную функцию? Опять же, я не хочу, чтобы это был тип varchar, но тип datetime.

7 ответов

Если вы не хотите использовать преобразования строк, вот решение:

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)


Используйте 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())

Это немного быстрее, чем преобразование в строковое представление и из него.


Использование:

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(19), GETDATE(), 120))

Это:

CONVERT(VARCHAR(19), GETDATE(), 120)

... опускает миллисекунды, возвращая VARCHAR. Таким образом, вы CAST/CONVERT, что в DATETIME, чтобы работать с желаемым типом данных.

Смотрите эту ссылку для списка различных форматов даты и времени, с которыми вы можете работать.


попробуйте это

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)


SELECT GETDATE(),
 CONVERT(DATETIME, CONVERT(VARCHAR(MAX), GETDATE(), 120), 120)


Вычитайте миллисекунду с даты. (Или добавить отрицательное значение миллисекунды)

SELECT DATEADD(ms, -DATEPART(ms, GETDATE()), GETDATE())

От SQL Server удаляет миллисекунды из datetime


DATEADD(SECOND, DATEDIFF(SECOND, 0, < your datetime column >), 0)

Может потребоваться изменить значение 0 на что-то еще, чтобы предотвратить ошибку переполнения. Не нужно иметь SQL Server под рукой, чтобы проверить.

Хотя этот метод не кажется интуитивным с первого взгляда, посмотрите здесь на обоснование: http://www.karaszi.com/SQLServer/info_datetime.asp#GettingRidOfTimePortion

ИЗМЕНИТЬ: см. комментарии

licensed under cc by-sa 3.0 with attribution.