SQL Server удаляет миллисекунды из даты и времени - PullRequest
45 голосов
/ 20 июля 2010
select *
from table
where date > '2010-07-20 03:21:52'

, который, как я ожидаю, не даст мне никаких результатов ... ЗА ИСКЛЮЧЕНИЕМ я получаю запись с датой и временем 2010-07-20 03:21:52.577

как заставить запрос игнорировать миллисекунды?

Ответы [ 11 ]

78 голосов
/ 20 июля 2010

Вам просто нужно вычислить миллисекундную часть даты и вычесть ее перед сравнением, например так:

select * 
from table 
where DATEADD(ms, -DATEPART(ms, date), date) > '2010-07-20 03:21:52'
16 голосов
/ 20 июля 2010
select * from table
     where DATEADD(ms, DATEDIFF(ms, '20000101', date), '20000101') > '2010-07-20 03:21:52'

Вам придется обрезать миллисекунды перед сравнением, которое будет медленным во многих строках

Чтобы исправить это, выполните одно из следующих действий:

  • создал вычисляемый столбецс приведенными выше выражениями для сравнения с
  • удалить миллисекунды при вставке / обновлении, чтобы избежать накладных расходов на чтение
  • Если в SQL Server 2008 используется datetime2(0)
13 голосов
/ 20 июля 2010

Попробуйте:

SELECT * 
FROM table 
WHERE datetime > 
CONVERT(DATETIME, 
CONVERT(VARCHAR(20), 
CONVERT(DATETIME, '2010-07-20 03:21:52'), 120))

Или, если ваша дата является фактическим значением даты и времени:

DECLARE @date DATETIME
SET @date = GETDATE()
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(20), @date, 120))

Преобразование в стиль 120 обрезает миллисекунды ...

10 голосов
/ 19 февраля 2017

Если вы используете SQL Server (начиная с 2008 года), выберите один из следующих вариантов:

  • CONVERT (DATETIME2 (0), YourDateField)
  • ВЛЕВО (RTRIM (CONVERT (DATETIMEOFFSET, YourDateField)), 19)
  • CONVERT (DATETIMEOFFSET (0), YourDateField) - с добавлением смещения часового пояса
9 голосов
/ 20 июля 2010

Для этого конкретного запроса, зачем делать дорогие вызовы функций для каждой строки, если вы можете просто запросить значения, начиная со следующей более высокой секунды:

select *
from table
where date >= '2010-07-20 03:21:53'
6 голосов
/ 25 октября 2017

Использовать CAST со следующими параметрами:

Дата

select Cast('2017-10-11 14:38:50.440' as date)

Выход: 2017-10-11

Дата и время

select Cast('2017-10-11 14:38:50.440' as datetime)

Вывод: 2017-10-11 14: 38: 50,440

SmallDatetime

select Cast('2017-10-11 14:38:50.440' as smalldatetime)

Выходные данные: 2017-10-11 14: 39: 00

DatetimeOffset

select Cast('2017-10-11 14:38:50.440' as datetimeoffset)

Выходные данные: 2017-10-11 14: 38: 50.4400000 +00: 00

Дата-время2

select Cast('2017-10-11 14:38:50.440' as datetime2)

Выход: 2017-10-11 14: 38: 50.4400000

2 голосов
/ 11 мая 2012

Существует более одного способа сделать это:

select 1 where datediff(second, '2010-07-20 03:21:52', '2010-07-20 03:21:52.577') >= 0

или

select *
from table
where datediff(second, '2010-07-20 03:21:52', date) >= 0 

на один вызов функции меньше, но вам следует остерегаться переполнения максимального целого числа, если даты слишком далеко друг от друга.

1 голос
/ 08 января 2018

Использовать тип данных «Smalldatetime»

select convert(smalldatetime, getdate())

принесет

2015-01-08 15:27:00
1 голос
/ 05 июля 2016

Пожалуйста, попробуйте это

select substring('12:20:19.8470000',1,(CHARINDEX('.','12:20:19.8470000',1)-1))


(No column name)
12:20:19
0 голосов
/ 01 февраля 2017

Может быть, это поможет .. SELECT [Datetime] = CAST ('20120228' AS smalldatetime)

о / р: 2012-02-28 00: 00: 00

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