在 SQL 中使用通配符定义上次登录时间时的 WHERE 子句

WHERE clause when defining last logon time with wildcard in SQL

我进行了搜索,但没有找到与我的问题相关的任何内容:

SELECT 
    vSMS_R_System.Netbios_Name0 AS 'Name',
    vSMS_R_System.Distinguished_Name0 AS 'LDAP',
    vSMS_R_System.Operating_System_Name_and0 AS 'OS Version',
    vSMS_R_System.Last_Logon_Timestamp0 AS 'Last Logon Time',
    vSMS_R_System.Active0 AS 'Active State'
FROM 
    vSMS_R_System
WHERE 
    Distinguished_Name0 LIKE '%Site Servers%' 
    AND Operating_System_Name_and0 LIKE 'Microsoft Windows NT Server 6.%'
    AND Last_Logon_Timestamp0 LIKE '%2017-02%'

执行此查询时,不会显示任何结果,但是删除最后一行将毫无问题地执行结果。这似乎是 Last_Logon_Timestamp0 的通配符,这是这里的一个问题。

我已将查询的最后一行修改为以下内容:

AND Last_Logon_Timestamp0 LIKE '%2017%'

这显示了我需要的结果。所以它似乎是在我的原始查询中声明通配符值时导致问题的连字符。

是否需要以不同方式处理此信息?连字符似乎不是非法字符,但它确实阻止了信息的显示。

假设 last_logon_timestamp0 是某种 datetime,那么您应该使用 date/time 函数,而不是字符串函数。所以:

SELECT s.Netbios_Name0 AS Name,
       s.Distinguished_Name0 AS LDAP,
       s.Operating_System_Name_and0 AS [OS Version],
       s.Last_Logon_Timestamp0 AS [Last Logon Time],
       s.Active0 AS [Active State]
FROM vSMS_R_System s
WHERE s.Distinguished_Name0 LIKE '%Site Servers%' AND
      s.Operating_System_Name_and0 LIKE 'Microsoft Windows NT Server 6.%' AND
      s.Last_Logon_Timestamp0 >= '2017-02-01' AND
      s.Last_Logon_Timestamp0 < '2017-03-01' ;

备注:

  • 您的代码使用恰好设置的任何国际化设置将该列转换为本地 date/time 表示。
  • 时间比较允许数据库在列上使用索引(如果可用)。
  • Table 别名使查询更易于编写和阅读。
  • 不要对列名使用单引号,因为它们很容易与字符串常量混淆。它们应该只用于字符串和日期常量。
  • 尽量避免使用空格和其他非标准变量的列别名,这样您就不需要对名称进行转义。