解决:sql中将日期字符串当做日期类型处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaofen_7/article/details/82791904

敲机房中看着同期的人的博客,学习存储过程的使用,在查询记录和金额查询这里,拥有共同的窗体,所以自己就使用了模板方法+存储过程!查询日期的过程让我遇到了问题。

实体中声明了3个字段,分别是数据表起始日期终止日期

然后把dateTimepicker控件中的值分别给字段,数据表的值【通过重写模板类中的虚方法得到】

//实体层赋值
//-----------选择数据表
queryCash.Tablename = GetDbTableName();

//-----------选择字段
//dateTimePicker1.CustomFormat = "yyyy-MM-dd";
//dateTimePicker2.CustomFormat = "yyyy-MM-dd";

string[] date1 = dateTimePicker1.Value.ToString("yyyy-MM-dd").Split(' ');
string[] date2 = dateTimePicker2.Value.ToString("yyyy-MM-dd").Split(' ');

queryCash.Cmdfiled1 = date1[0];
queryCash.Cmdfiled2 = date2[0];

在这里,dateTimepicker获得的日期默认的格式:yyyy-MM-dd hh:mm:ss.000

这个时候需要先将日期类型转换为字符串类型,然后截取字符串获得日期就可以了,不能使用CustomFormat,这个只是显示日期类型,并没有将值转换为字符串!

通过中间的传递,到D层的时候

namespace DAL
{
    class QueryCashTemplateDAL : IDAL.QueryCashTemplate
    {
        public DataTable queryCash(QueryCash queryCash)
        {
            SqlHelper sqlHelper = new SqlHelper();
            SqlParameter[] sqlParams = {

                new SqlParameter("@cmdfiled1",queryCash.Cmdfiled1),
                new SqlParameter("@cmdfiled2",queryCash.Cmdfiled2),

                new SqlParameter("@tablename", queryCash.Tablename)
            };
            string sql = "PROC_CheckCashDouble";
            DataTable table = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.StoredProcedure);
            return table;
        }
    }
}

D层调用存储过程

一开始写的存储过程中最关键的的语句是这样的,我以为它执行的时候,会将表名,两个日期以字符串的格式传过来,这样运行整个sql语句【本质是字符串】就可以了。

我以为的过程:

但实际数据库里的执行:

但后来执行,明明数据库里是有记录的,但查询不出来,原因是sql语句在执行的时候,将两个字符串类型的日期当做日期类型识别处理,用日期类型的值数据库里字符串类型的值做匹配,当然不成功,所以查不出来!

USE [ChargeSystem]
GO
/****** Object:  StoredProcedure [dbo].[PROC_CheckCashDouble]    Script Date: 2018/9/20 19:00:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:赵芬
-- Create date: 2018-9-18
-- Description:	用于查询(收取和返回)金额时和数据库交互
-- =============================================
ALTER PROCEDURE [dbo].[PROC_CheckCashDouble]  
    /***需要传递的参数**/
	@cmdfiled1 varchar(50),
	@cmdfiled2 varchar(50),
	@tablename varchar(50)	
AS
	declare @TempSql varchar(500)
	
BEGIN
	SET @TempSql= 'select * from '+@tablename+' where DateTime between '+@cmdfiled1+' and '+@cmdfiled2	
    execute(@TempSql)  
end

后来,我就想如果能将穿过来的参数加工一下,让数据库只能把它当做字符串处理就可以了,所以,我就想在这两个字符串类型的日期两遍分别加上单引号,这样就绝对不会出问题了,所以就大胆做了尝试!

ALTER PROCEDURE [dbo].[PROC_CheckCashDouble]  
    /***需要传递的参数**/
	@cmdfiled1 varchar(50),
	@cmdfiled2 varchar(50),
	@tablename varchar(50)
	
	
AS
	declare @TempSql varchar(500)
	declare @smb char(2)
BEGIN
	Set @smb =''''
	set @cmdfiled1 =@smb+@cmdfiled1+@smb
	set @cmdfiled2 =@smb+@cmdfiled2+@smb
	
	SET @TempSql= 'select * from '+@tablename+' where DateTime between '+@cmdfiled1+' and '+@cmdfiled2
	print @TempSql
    execute(@TempSql) 
end

最终的结果:

在声明单引号时:注意

Set @smb ='''
--不能这样写,或许你会说,字符串不是要用单引号括起来吗?前后各需要一个单引号就可以,为什么要加两个
--答:
---:1.就近匹配,这样想会认为前两个单引号刚好一对,多出来的单引号就会报错
---:2.所以没有办法只加一个单引号
---:3.所以,我就用前后放了一对单引号
---:4.这样,内层的两个单引号将值转换为字符型
---:5.外层,外层用来标识里面的内容为字符串

猜你喜欢

转载自blog.csdn.net/zhaofen_7/article/details/82791904