SQL Server从datetime中删除毫秒

E-M*_*add 48 t-sql sql-server

select *
from table
where date > '2010-07-20 03:21:52'
Run Code Online (Sandbox Code Playgroud)

我希望不会给我任何结果...除了我得到一个日期时间为的记录 2010-07-20 03:21:52.577

如何使查询忽略毫秒?

Gab*_*abe 82

您只需要弄清楚日期的毫秒部分并在比较之前将其减去,如下所示:

select * 
from table 
where DATEADD(ms, -DATEPART(ms, date), date) > '2010-07-20 03:21:52'
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这实际上会删除毫秒,但不会删除较小的单位,例如对于 `'2021-06-14 00:00:00.1234567'` `select DATEADD(ms, -DATEPART(ms, date), date)` 会产生`2021-06-14 00:00:00.0004567` (2认同)

gbn*_*gbn 16

select * from table
     where DATEADD(ms, DATEDIFF(ms, '20000101', date), '20000101') > '2010-07-20 03:21:52'
Run Code Online (Sandbox Code Playgroud)

你必须在比较之前修剪毫秒,这将在许多行上缓慢

做其中一个来解决这个问题:

  • 使用上面的表达式创建一个计算列以进行比较
  • 删除插入/更新时的毫秒数以避免读取开销
  • 如果是SQL Server 2008,请使用 datetime2(0)

  • datetime2是最好的(最便宜的)解决方案IMO (2认同)

8kb*_*8kb 14

尝试:

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

或者,如果您的日期是实际的日期时间值:

DECLARE @date DATETIME
SET @date = GETDATE()
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(20), @date, 120))
Run Code Online (Sandbox Code Playgroud)

转换为样式120会缩短毫秒数......


MMJ*_*MMJ 10

如果您使用的是SQL Server(从2008开始),请选择以下选项之一:

  • CONVERT(DATETIME2(0),YourDateField)
  • 左(RTRIM(CONVERT(DATETIMEOFFSET,YourDateField)),19)
  • CONVERT(DATETIMEOFFSET(0),YourDateField)- 添加时区偏移

  • 如果 > 0.5,DATETIME2 选项将向上舍入,LEFT(RTRIM 选项将截断。两者都很有用 (5认同)

Har*_*d L 9

对于这个特定的查询,当你可以从下一个更高的秒开始询问值时,为什么要为每一行进行昂贵的函数调用:

select *
from table
where date >= '2010-07-20 03:21:53'
Run Code Online (Sandbox Code Playgroud)

  • 日期值很可能不是手动输入的,而是来自某个包含日期的变量,该变量将被插入到查询中。因此,无论如何您都需要使用函数,因为需要在 WHERE 子句中使用的时间上添加 1 秒,例如使用函数 DATEADD(second, 1, date)。;) (2认同)

Aks*_*hra 6

使用具有以下参数的CAST

日期

select Cast('2017-10-11 14:38:50.440' as date)
Run Code Online (Sandbox Code Playgroud)

产出:2017-10-11

约会时间

select Cast('2017-10-11 14:38:50.440' as datetime)
Run Code Online (Sandbox Code Playgroud)

输出:2017-10-11 14:38:50.440

小约会时间

select Cast('2017-10-11 14:38:50.440' as smalldatetime)
Run Code Online (Sandbox Code Playgroud)

输出:2017-10-11 14:39:00

日期时间偏移

select Cast('2017-10-11 14:38:50.440' as datetimeoffset)
Run Code Online (Sandbox Code Playgroud)

输出:2017-10-11 14:38:50.4400000 +00:00

日期时间2

select Cast('2017-10-11 14:38:50.440' as datetime2)
Run Code Online (Sandbox Code Playgroud)

输出:2017-10-11 14:38:50.4400000


Pre*_*rem 5

使用“小日期时间”数据类型

select convert(smalldatetime, getdate())
Run Code Online (Sandbox Code Playgroud)

将获取

2015-01-08 15:27:00
Run Code Online (Sandbox Code Playgroud)

  • 这也会截断秒,这不是提问者想要的。 (10认同)