zoukankan      html  css  js  c++  java
  • SQL语句中,Conversion failed when converting datetime from character string.错误的解决办法

      在项目开发过程中,我们经常要做一些以时间为条件的查询,比如查询指定时间范围内的历史记录,然而这些时间都是从UI传递过来的参数,所以我们写的sql语句就必须用到字符串拼接。当然,在C#中写SQL语句还好处理,可以使用C#的字符串函数做对应的数据类型转换。但是,如果用的是存储过程的话,就有点纠结了。下面来说一下我在写存储过程中遇到的问题:

    为了更加直接的说明问题,写如下一个简单的例子:

    declare @dateFrom datetime;
    declare @dateTo   datetime;
    declare @str nvarchar(500);
    declare @strOne nvarchar(100);
    declare @strTwo nvarchar(200);
    declare @sql nvarchar(1000);
    
    set @dateFrom = '2014-01-01';
    set @dateTo = getdate();
    
    set @strOne = ' and DateCreated >= ' + @dateFrom;
    
    set @str = 'select * from Users where 1 = 1';
    set @sql = @str + @strOne;
    
    print @sql;
    
    exec sp_executesql @sql

    这个时候,执行SQL的话,就会出现如下错误:

    分析原因,主要是因为@dateFrom数据类型为Datetime,和字符串连接时类型不匹配,所以下面就来做类型转换:

    SQL Server中有个Convert函数,可以用来做类型转换,用法如下:

    定义和用法

    CONVERT() 函数是把日期转换为新数据类型的通用函数。

    CONVERT() 函数可以用不同的格式显示日期/时间数据。

    语法

    CONVERT(data_type(length),data_to_be_converted,style)

    data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style 规定日期/时间的输出格式。

    实例

    下面的脚本使用 CONVERT() 函数来显示不同的格式。我们将使用 GETDATE() 函数来获得当前的日期/时间:

    CONVERT(VARCHAR(19),GETDATE())
    CONVERT(VARCHAR(10),GETDATE(),110) 
    CONVERT(VARCHAR(11),GETDATE(),106)
    CONVERT(VARCHAR(24),GETDATE(),113)
    

    结果类似:

    Dec 29 2008 11:45 PM
    12-29-2008
    29 Dec 08
    29 Dec 2008 16:25:46.635

    参照上面用法,我们修改代码如下:

    declare @dateFrom datetime;
    declare @dateTo   datetime;
    declare @str nvarchar(500);
    declare @strOne nvarchar(100);
    declare @strTwo nvarchar(200);
    declare @sql nvarchar(1000);
    
    set @dateFrom = '2014-01-01';
    set @dateTo = getdate();
    
    -- set @strOne = ' and DateCreated >= ''' + convert(nvarchar(20),@dateFrom,20) + '''';
    -- set @strTwo = ' and DateCreated <= ''' + convert(nvarchar(20),@dateTo,20) + '''';
    
    set @strOne = ' and t68DateCreated between ''' + convert(nvarchar(20),@dateFrom,20)
                + ''' and ''' + convert(nvarchar(20),@dateTo,20) + '''';
    
    -- select * from Authors_t68 where Users between @dateFrom and @dateTo
    set @str = 'select * from Authors_t68 where 1 = 1';
    
    -- set @sql = @str + @strOne + @strTwo;
    set @sql = @str + @strOne;
    
    print @sql;
    
    exec sp_executesql @sql

    这个时候,执行,就可以查询出结果了。两种拼接方法,注释掉的使用了两个条件来限定时间范围,后一种方法用的是between...and方法。

  • 相关阅读:
    iPhone 调用Web Service 例子(转)
    iPhone开发:在UIAlertView中显示进度条(转)
    Oracel 分页
    NYOJ 477
    NYOJ 108(数组中存的是前n个数的和)
    NYOJ 199
    NYOJ 311(完全背包)
    高效斐数(前92位)
    NYOJ 57(6174问题)
    NYOJ 546(分珠宝)
  • 原文地址:https://www.cnblogs.com/yunfeifei/p/3820770.html
Copyright © 2011-2022 走看看