我有一个基于msdb..sysjobhistory表的查询,我的SQL Server的MSDB数据库。我希望能够只返回前一个日期的东西。 (在此示例中,2015年1月14日将是昨天)当 run_date 信息为YYYYMMDD整数格式时,如何解决此问题?
SELECT server
, jh.run_date
, jh.run_time
, j.name
, jh.run_duration
, jh.step_name
, run_status
, message
FROM msdb..sysjobhistory jh
INNER JOIN msdb..sysjobs j ON jh.job_id = j.job_id
WHERE jh.step_id = 0
请指教。
-Nick
答案 0 :(得分:1)
您可以尝试首先将该INT转换为VARCHAR,然后使用112“样式”(在Cast and Convert的MSDN页面上注明),将其转换为真正的DATETIME。例如:
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), 20150115), 112)
当然,单独执行此操作会使[run_date]
字段上的索引无效(如果有)。如果是这种情况,那么您可以只执行DATEADD减去一天,然后转换回VARCHAR然后再转换为INT。例如:
SELECT CONVERT(INT,
CONVERT(VARCHAR(10),
DATEADD(DAY,
-1,
CONVERT(DATETIME, CONVERT(VARCHAR(10), 20150115), 112)
),
112
)
);
在我的SQL Server 2012实例上,[run_date]
上没有索引,但最好还是不要在函数周围包装字段。
如果仅使用DATETIME
提供的GETDATE()
值,则会显示如下:
WHERE jh.step_id = 0
AND jh.run_date = CONVERT(INT,
CONVERT(VARCHAR(10),
DATEADD(DAY, -1, GETDATE()),
112)
)