【问题标题】:Search Stored Procedure (SQL Server) -- Conversion failed when converting date and/or time from character string -- Simple?搜索存储过程(SQL Server)——从字符串转换日期和/或时间时转换失败——简单吗?
【发布时间】:2014-10-30 03:45:23
【问题描述】:

我有一个存储过程,我将 3 个变量 bankNumberbranchNumberDateFrom 传递给。

基于这些变量,我想查询表(见下图存储过程)以返回所有符合我通过的条件的记录(通过变量)。

相反,我收到此错误:

从字符串转换日期和/或时间时转换失败

当我将 DateFrom 变量传递给它时,它似乎失败了。

感谢您的帮助

ALTER PROCEDURE [dbo].[Search_Records] 
    @bankNumber varchar(3),
    @branchNumber varchar(3),
    @dateCreated datetime
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    DECLARE 
        @Bank_Number varchar(3) = @bankNumber,
        @Branch_Number varchar(3) = @branchNumber,
        @DateFrom datetime = @dateCreated,
        @DateTo datetime = @dateCreated

    SELECT DISTINCT     
        A.bankNumber, 
        A.branchNumber, 
        A.dateCreated
    FROM        
        dbo.CENSORED A
    WHERE
        (@Branch_Number IS NULL OR bankNumber LIKE @BankNumber + '%')
        AND (@Branch_Number IS NULL OR branchNumber LIKE @Branch_Number + '%')
        AND (@DateFrom IS NULL OR dateCreated LIKE + @DateFrom + '%')
        AND (@DateTo IS NULL OR dateCreated LIKE + @DateTo + '%')
  END

【问题讨论】:

  • 你在使用 MySQL 吗?还是 SQL Server?它们不是一回事。
  • @JohnConde sql server 感谢您指出这一点。
  • @DateFrom + '%' 是什么意思?匹配月份?配对日?匹配年份?匹配时间?........
  • @M.Ali 我试图只匹配月份。谢谢你的提问。
  • 还有@dateCreated是从哪里来的?

标签: sql-server stored-procedures


【解决方案1】:

您不能将LIKE 运算符与日期时间值一起使用。如果您仅在月份匹配,则需要使用 MONTH() 函数。 LIKE 运算符只能用于字符串数据类型。

看不到存储过程中声明的所有这些变量的意义,简化版本应该类似于 ....

ALTER PROCEDURE [dbo].[Search_Records] 
    @bankNumber varchar(3),
    @branchNumber varchar(3),
    @dateCreated datetime
AS
BEGIN
    SET NOCOUNT ON;

    SELECT DISTINCT     
        A.bankNumber, 
        A.branchNumber, 
        A.dateCreated
    FROM        
        dbo.CENSORED A
    WHERE
            (@Branch_Number IS NULL OR bankNumber   LIKE @bankNumber + '%')
        AND (@Branch_Number IS NULL OR branchNumber LIKE @branchNumber + '%')
        AND (@dateCreated   IS NULL OR (MONTH(dateCreated) = MONTH(@dateCreated) 
                                         AND 
                                        YEAR(dateCreated) = YEAR(@dateCreated)))

END

注意

这将产生一个非常低效的执行计划,请考虑使用动态 sql 进行带有可选参数的查询。

【讨论】:

  • 我很抱歉我知道我之前误导了你我的意思是我正在尝试匹配这种格式 MM/DD/YY
  • MM/DD/YY 是日期时间值的字符串表示形式。您的列和变量都是 Datetime 数据类型,这很好。你只需要在你的选择中使用转换函数来获得所需的日期格式,我认为应该是CONVERT(VARCHAR(8), A.dateCreated, 1)
  • 我现在要实现它,看看它是如何进行的。我会 brb。谢谢!
猜你喜欢
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多