select *
from table
where date > '2010-07-20 03:21:52'
который я ожидал бы, чтобы не дать мне никаких результатов... ЗА ИСКЛЮЧЕНИЕМ Я получаю запись с datetime 2010-07-20 03:21:52.577
как я могу заставить запрос игнорировать миллисекунды?
select *
from table
where date > '2010-07-20 03:21:52'
который я ожидал бы, чтобы не дать мне никаких результатов... ЗА ИСКЛЮЧЕНИЕМ Я получаю запись с datetime 2010-07-20 03:21:52.577
как я могу заставить запрос игнорировать миллисекунды?
Вам просто нужно выяснить миллисекундную часть даты и вычесть ее перед сравнением, например:
select *
from table
where DATEADD(ms, -DATEPART(ms, date), date) > '2010-07-20 03:21:52'
select * from table
where DATEADD(ms, DATEDIFF(ms, '20000101', date), '20000101') > '2010-07-20 03:21:52'
Вам придется обрезать миллисекунды перед сравнением, которое будет медленным во многих строках
Выполните одно из следующих действий:
datetime2(0)
Try:
SELECT *
FROM table
WHERE datetime >
CONVERT(DATETIME,
CONVERT(VARCHAR(20),
CONVERT(DATETIME, '2010-07-20 03:21:52'), 120))
Или, если ваша дата является фактическим значением datetime:
DECLARE @date DATETIME
SET @date = GETDATE()
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(20), @date, 120))
Преобразование в стиль 120 сокращает миллисекунды...
Для этого конкретного запроса зачем делать дорогие вызовы функций для каждой строки, если вы можете просто задать значения, начиная со следующей более высокой секунды:
select *
from table
where date >= '2010-07-20 03:21:53'
Если вы используете SQL Server (начиная с 2008 года), выберите один из следующих вариантов:
Используйте CAST со следующими параметрами:
Дата
select Cast('2017-10-11 14:38:50.440' as date)
Выход: 2017-10-11
Datetime
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
Datetime2
select Cast('2017-10-11 14:38:50.440' as datetime2)
Выход: 2017-10-11 14: 38: 50.4400000
Там более одного способа сделать это:
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
один вызов функции меньше, но вы должны остерегаться переполнения максимального числа, если даты слишком далеки друг от друга.
Пожалуйста, попробуйте
select substring('12:20:19.8470000',1,(CHARINDEX('.','12:20:19.8470000',1)-1))
(No column name)
12:20:19
Используйте тип данных "Smalldatetime"
select convert(smalldatetime, getdate())
принесет
2015-01-08 15:27:00
Еще один способ, которым я задал запросы SQL Server, чтобы игнорировать миллисекунды, когда я ищу события с определенной секунды (в параметре в формате "ГГГГ-ММ-ДД ЧЧ: ТТ: СС" ), используя сохраненный процедура:
WHERE
...[Time_stamp] >= CAST(CONCAT(@YYYYMMDDHHTTSS,'.000') as DateTime) AND
...[Time_stamp] <= CAST(CONCAT(@YYYYMMDDHHTTSS,'.999') as DateTime)
Вы можете использовать что-то похожее, чтобы игнорировать минуты и секунды.
Может быть, это поможет.. SELECT [Datetime] = CAST ('20120228' AS smalldatetime)
о/р: 2012-02-28 00:00:00
SELECT convert (datetime2 (0), getdate())