Опуская миллисекунды в дате - PullRequest
24 голосов
/ 11 февраля 2010

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

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

Ответы [ 7 ]

51 голосов
/ 12 февраля 2010

Используйте 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 и ранее:

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())

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

11 голосов
/ 11 февраля 2010

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

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

Это:

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

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

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

9 голосов
/ 11 февраля 2010

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

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)
6 голосов
/ 11 февраля 2010

попробуйте

 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)
4 голосов
/ 11 февраля 2010
SELECT  GETDATE(),
        CONVERT(DATETIME, CONVERT(VARCHAR(MAX), GETDATE(), 120), 120)
3 голосов
/ 04 декабря 2012

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

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

С SQL Server удаляет миллисекунды с даты и времени

2 голосов
/ 11 февраля 2010
DATEADD(SECOND, DATEDIFF(SECOND, 0, < your datetime column >), 0)

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

Хотя этот метод не кажется интуитивно понятным с первого взгляда, посмотрите здесь обоснование: http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...