我正在尝试清理一些服务器,并希望找出过去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
以下是此查询的结果:
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
基于这些结果,我只希望从该查询中返回Drake_Test
和OLD_DB
。在过去30天内访问了其他3个数据库。
此外,更改T-SQL查询的主要问题是,当我尝试将LastAccessDate
列用作子句的一部分时,它说这是无效的列吗?
答案 0 :(得分:5)
我喜欢将CTE用于此类事情:
function foo(arr1, sum){
let arr = arr1;
for(let i=0; i<9999;i++){
let val1=arr[Math.floor(Math.random()*arr.length)];
arr.splice(arr.indexOf(val1),1);
console.log(arr1);
let val2=arr[Math.floor(Math.random()*arr.length)];
arr.splice(arr.indexOf(val2),1);
let val3=arr[Math.floor(Math.random()*arr.length)];
arr.splice(arr.indexOf(val3),1);
let val4=arr[Math.floor(Math.random()*arr.length)];
arr.splice(arr.indexOf(val4),1);
if(val1+val2+val3+val4 == sum){
console.log(val1,val2,val3,val4);
return [val1,val2,val3,val4];
}
arr=arr1;
}
}
console.log(foo([2, 7, 4, 0, 9, 5, 1, 3], 20));