SQL Server数据库未访问1个月

dra*_*ake 1 sql t-sql sql-server datetime

我正在尝试清理一些服务器,并想知道在过去30天内哪些数据库没有被访问过.如何将我的T-SQL查询更改为仅显示过去30天内未访问过的数据库?

有关其他信息,我还包括上次重新启动服务器的时间.这与此问题无关.

例如,今天是10月10日.自9月10日以来访问过的任何数据库,我都不想出现在我的查询结果中.

这是我当前的T-SQL脚本,用于查找上次在我的服务器上访问数据库的时间:

SELECT
    DB_NAME(sd.database_id) AS DatabaseName,
    COALESCE(MAX(ius.last_user_seek), MAX(ius.last_user_scan),
             MAX(ius.last_user_lookup), MAX(ius.last_user_update), '1/1/1900') AS LastAccessDate,
    (SELECT create_date 
     FROM sys.databases 
     WHERE name = 'tempdb') AS LastServerRestart
FROM 
    sys.databases sd
LEFT JOIN
    sys.dm_db_index_usage_stats ius ON ius.database_id = sd.database_id
WHERE 
    DB_NAME(sd.database_id) NOT IN ('tempdb', 'master', 'model', 'msdb')
GROUP BY 
    sd.database_id
ORDER BY 
    DatabaseName
Run Code Online (Sandbox Code Playgroud)

以下是此查询的结果:

DatabaseName            LastAccessDate             LastServerRestart
--------------------------------------------------------------------------
AdventureWorks2016      2018-09-12 18:21:21.800    2018-09-12 18:21:10.727
AdventureWorksDW2016    2018-10-10 09:40:31.903    2018-09-12 18:21:10.727
Drake_Test              1900-01-01 00:00:00.000    2018-09-12 18:21:10.727
OLD_DB                  1900-01-01 00:00:00.000    2018-09-12 18:21:10.727
Drake_Test_new          2018-10-10 14:20:17.943    2018-09-12 18:21:10.727
Run Code Online (Sandbox Code Playgroud)

基于这些结果,我只希望Drake_TestOLD_DB从该查询返回.在过去30天内访问过其他3个数据库.

此外,更改我的T-SQL查询的一个主要问题是,当我尝试将LastAccessDate列用作子句的一部分时,它表示它是一个无效的列?

Aar*_*etz 5

我喜欢用CTE来做这种事情:

WITH CTE AS (
     SELECT DB_NAME(sd.database_id) AS DatabaseName,
            COALESCE(
               MAX(ius.last_user_seek),
               MAX(ius.last_user_scan),
               MAX(ius.last_user_lookup),
               MAX(ius.last_user_update),
               '1/1/1900') AS LastAccessDate,
               (SELECT create_date FROM sys.databases WHERE name = 'tempdb') AS LastServerRestart
     FROM sys.databases sd
     LEFT JOIN sys.dm_db_index_usage_stats ius on ius.database_id = sd.database_id
     WHERE DB_NAME(sd.database_id) NOT IN('tempdb', 'master', 'model', 'msdb')
     GROUP BY sd.database_id)

SELECT *
FROM CTE
WHERE LastAccessDate < DATEADD(DAY,-30,GETDATE())
ORDER BY DatabaseName
Run Code Online (Sandbox Code Playgroud)