我要遍历一个遗留系统,在该遗留系统中,表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的任何想法或指针?
答案 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)