SQL语句中,Conversion failed when converting datetime from character string.错误的解决办法

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

  在项目开发过程中,我们经常要做一些以时间为条件的查询,比如查询指定时间范围内的历史记录,然而这些时间都是从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方法。

 

目录
相关文章
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
594 0
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
450 0
|
存储 数据库
【YashanDB知识库】YAS-00218 string conversion failed.
**简介:** 在数据导入导出过程中,使用 `imp` 工具导入 dump 文件时出现 `YAS-00218 string conversion failed` 错误。经分析,问题源于数据库字符集不匹配或原始 dump 文件中存在乱码。通过查看数据库服务端字符集(`show parameter character`)及采用折半查找法定位具体报错行,确认乱码导致导入失败。此问题影响版本为 23.2.1.100。
|
监控 druid Java
Druid【SpringBoot集成】监控数据库报错 Failed to bind properties under ‘‘ to javax.sql.DataSource 解决(含配置源码)
Druid【SpringBoot集成】监控数据库报错 Failed to bind properties under ‘‘ to javax.sql.DataSource 解决(含配置源码)
1438 0
|
数据库
【YashanDB 知识库】exp 导出 csv 报错 YAS-00218 string conversion failed
**问题分类:** 数据导入导出 **关键字:** YAS-00218 string conversion failed **问题描述:** 使用 exp 导出成 CSV 时,报错 YAS-00218 string conversion failed。 **原因分析:** 数据库服务端字符集为 GBK,但客户端缺少 yasc_env.ini 文件,导致默认使用 UTF8 字符集。 **解决方法:** 创建 yasc_env.ini 文件并设置 CHARACTER_SET=GBK。 **影响范围:** 23.2.1.100
|
存储 数据库
【YashanDB 知识库】YAS-00218 string conversion failed.
**简介:** 在使用 `imp` 导入 dump 文件时,遇到错误 YAS-00218 string conversion failed。通过检查数据库字符集及使用折半查找法定位问题行,发现原始 dump 文件中存在乱码,导致导入失败。此问题影响版本 23.2.1.100。建议检查并修正源数据字符编码后再进行导入操作。
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
1930 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
5292 11
|
SQL Windows
安装SQL Server 2005时出现对性能监视器计数器注册表值执行系统配置检查失败的解决办法...
安装SQL Server 2005时出现对性能监视器计数器注册表值执行系统配置检查失败的解决办法...
385 4
|
JSON 前端开发 数据格式
`java.time.LocalDateTime` from String \“2020-11-19\“: Failed to deserialize java.time.LocalDateTime
`java.time.LocalDateTime` from String \“2020-11-19\“: Failed to deserialize java.time.LocalDateTime
438 1