SQL Date作为查询日期的INT

时间:2015-01-15 18:20:16

标签: sql-server-2012 datetime-format

我有一个基于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

1 个答案:

答案 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)
                             )