基于名称字段中日期的TSQL列表结果减去GETDATE()函数

时间:2019-11-14 18:59:43

标签: sql sql-server tsql

在质量检查环境中,我们为开发人员还原数据库,如果还原完成> 30天,则将其删除。这些还原的数据库的命名约定为MyCompany-HA_DBName_20191114_FirstL。

我需要创建一个脚本来删除30天以上的数据库,并每天通过SQL Agent作业运行此脚本以查找和删除30天以上的数据库。但是,我担心的是,还有其他具有相似命名约定(名称中不包括日期)的数据库将被删除。我在where子句的查询中排除了所有重要的数据库,但是我担心将要添加到服务器中的新数据库不应该删除。

我只需要返回名称早于30天的数据库,就需要帮助。到目前为止,我已经创建了以下查询,但是它没有返回某些数据库。我使用了like运算符,但有误。

感谢您的帮助。

IF OBJECT_ID('tempdb..#ListofDbsToDrop') IS NOT NULL DROP Table #ListofDbsToDrop
SELECT * INTO #ListofDbsToDrop 
FROM ( 
SELECT * FROM SYS.DATABASES 
WHERE DATABASE_ID > 4 --Exclude sys databases.
AND  GETDATE() - CREATE_DATE > 30 --Return databases created more than 30 days ago.  
AND NAME LIKE  'CompanyName-HA%[_]%%[99999999]%%[_]%%[A-Z][a-z]%'
AND NAME NOT IN (  --Exclude important databases. 
'MyCompany-HA_DBName',
'MyCompany-HA_DBName2'
)) AS ListofDatabases

Select * from #ListofDbsToDrop 

I will place drop database loop here. 

1 个答案:

答案 0 :(得分:1)

您有一个字符串。假设日期之前的部分没有数字,则可以使用以下字符串操作获取日期:

convert(date, left(stuff(name, 1, patindex('%[0-9]%', name) - 1, ''), 8))

然后,您可以直接与dateadd(day, -30, getdate())之类的内容进行过滤。

如果您的数据库不遵循此模式,请使用try_convert()

try_convert(date, left(stuff(name, 1, patindex('%[0-9]%', name) - 1, ''), 8))