Исключение миллисекунд на дате

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

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

26
задан Michał Powaga 10 May 2012 в 10:23
поделиться

6 ответов

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

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)
9
ответ дан 28 November 2019 в 06:11
поделиться

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

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

53
ответ дан 28 November 2019 в 06:11
поделиться

Используйте:

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

Это:

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

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

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

11
ответ дан 28 November 2019 в 06:11
поделиться
SELECT  GETDATE(),
        CONVERT(DATETIME, CONVERT(VARCHAR(MAX), GETDATE(), 120), 120)
4
ответ дан 28 November 2019 в 06:11
поделиться

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

 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)
6
ответ дан 28 November 2019 в 06:11
поделиться
DATEADD(SECOND, DATEDIFF(SECOND, 0, < your datetime column >), 0)

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

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

2
ответ дан 28 November 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: