如何在数据库中找到最大日期戳?

Jam*_*ins 3 sql-server datetime

我想在数据库中找到最近的日期。

我可以使用 sys.dm_db_index_usage_stats 来查找它上次更新的时间,但如果自上次服务器重启以来它没有更新,则此处没有任何值

我可以使用 MAX()

use adventureworks
select Max(ModifiedDate)
from HumanResources.Department
Run Code Online (Sandbox Code Playgroud)

但是我需要查看数据库中的每个表,找到每个日期时间(或日期、小日期时间、日期时间2)字段并多次运行查询,然后确定哪个是最近的。

我想要类似的东西

use <some_db>
select MAX(<FieldThatIsADate>)
from <anytable_in_db>
Run Code Online (Sandbox Code Playgroud)

我已经谷歌搜索,并没有找到使用数据类型代替字段名称的方法。我没有试图找到命名特定表的方法。

我怎样才能使这个查询像现实一样便携?

如果我必须为每个数据库中的每个表构建和运行一个唯一的查询,那么这就是我必须做的。

Duf*_*ffy 8

没有办法在像这样的各种表中查询更少的数据类型,这意味着整个数据库第二次保存在一组类似于系统表的表中。但是,使用 INFORMATION_SCHEMA 的动态 SQL 可以帮助您进行搜索,但它不能移植到其他类型的 SQL Server。大多数服务器应该有类似的东西可用,但每个服务器的语法将完全不同。

您可以执行以下操作来查找您要查找的内容:

SELECT 'SELECT max(modifiedData) FROM ('+
        (SELECT 'SELECT MAX(['+C.COLUMN_NAME+']) as modifiedData FROM ['+C.TABLE_SCHEMA+'].['+C.TABLE_NAME+'] UNION ' AS [text()]
        FROM INFORMATION_SCHEMA.COLUMNS C
        WHERE C.DATA_TYPE IN ('date','datetime','smalldatetime','datetime2')
        FOR XML PATH('')) + ') AS AllDateTimes'
Run Code Online (Sandbox Code Playgroud)

该动态 SQL 将输出一个查询,您可以运行该查询来查找您的 MAX 日期。请注意,在将输出复制到查询窗口后,您需要从内部 SELECT 修剪尾随 UNION。您可以使用 sys 表创建相同的查询,但您必须将其中的一些连接在一起,如果您不熟悉 sys 表的设置方式,则查询会更复杂一些。

总而言之,无论上下文如何,这都将返回存储在数据库中的最大日期。取决于它的使用方式,不能保证某些值在“未来”由于多种原因无法设置。