获取 getdate() 的前 n 个字符

get the first n characters of getdate()

我有一个案例比较日期,日期时间列的小时和当前日期,小时

select * from tbl where  LEFT(EVENT_TIME_column,13) !=LEFT(GETDATE(),13)

EVENT_TIME_column格式为'2019-08-15 12:32:40.0000000'

当我执行 LEFT(GETDATE(),13) 结果是 'Aug 15 2019'

你能建议如何在 '2019-08-15 12'(日期和时间)

中获得 GETDate()

不要对 date/time 值使用字符串函数!有非常好的内置函数:

where convert(date, event_time_column) = convert(date, getdate()) and
      datepart(hour, event_time_column) = datepart(hour, getdate())

如果你不关心索引的使用,那就用datediff():

where datediff(hour, event_time_column, getdate()) = 0

您可以通过以下 2 个单独的比较来检查这一点。这是为了检查日期和小时部分是否与日期和小时部分相同,如果 GETDATE() 与否。

WHERE CAST(EVENT_TIME_column AS DATE) = CAST(GETDATE() AS DATE)
AND DATEPART(HH,EVENT_TIME_column) =  DATEPART(HH,GETDATE())

要检查 NOT EQUAL TO,只需将 = 符号替换为 != 符号即可。

此外,如果我猜对了,您只是在尝试避免从 运行 小时至今的记录。如果是这种情况,您还可以使用以下逻辑过滤数据-

WHERE EVENT_TIME_column < DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)

如果你想要格式 yyyy-MM-dd hh那么可以这样做:

SELECT CONVERT(varchar(13),GETDATE(),120);

db<>fiddle

您可以在文档中找到 CONVERT 的所有样式代码的完整列表:Date and Time Styles

但是,您似乎想检查日期是否在当前小时内。那将是:

WHERE EVENT_TIME_column >= DATEADD(HOUR, DATEDIFF(HOUR, 0,GETDATE()),0)
  AND EVENT_TIME_column < DATEADD(HOUR, DATEDIFF(HOUR, 0,GETDATE())+1, 0)

这明确避免了列上的任何函数 EVENT_TIME_column;这将使查询不可 SARGable。