SQL Server将日期时间与Char比较

时间:2018-10-04 13:29:49

标签: sql sql-server

我要遍历一个遗留系统,在该遗留系统中,表report_date中的“日期”列t_results被设置为char(25)。

该列的名称为report_date,其类型为report_date (char(25),null)

存储过程将表用作

ALTER PROCEDURE [dbo].[s_report]
(
    @report_date_from DATETIME,
    @report_date_to DATETIME,
)
AS

SET NOCOUNT ON

SELECT * 
FROM 
    t_results
WHERE
    report_date >= @report_date_from AND report_date <= @report_date_to
ORDER BY report_id

当我以EXEC s_report '9/4/2018','10/2/2018'的身份运行它时,运行良好,并且得到了预期的结果。

当我运行下面的查询(与sproc相同)时,没有任何结果。

SELECT * 
FROM 
    t_results
WHERE
    report_date >= '09/04/2018' AND report_date <= '10/2/2018'

我不确定存储过程如何工作。关于如何在where子句中比较char和datetime的任何想法或指针?

2 个答案:

答案 0 :(得分:3)

您的存储过程正在转换为DateTime。如果其中一种类型不同,则SQL Server在进行检查时会进行隐式转换,因此SP代码隐式如下:

where cast(report_date as datetime) >= '09/04/2018' and cast(report_date as datetime) <= '10/2/2018'

注意:传递这样的日期字符串并不安全,并且取决于服务器设置。通过类似``20180904''和``20181002''。

答案 1 :(得分:2)

我认为您的proc本质上是这样做的:

SELECT * 
FROM t_results
WHERE report_date >= CAST ('09/04/2018' AS DATETIME) 
  AND report_date <= CAST ('10/2/2018' AS DATETIME)