1. 程式人生 > >解決:sql中將日期字串當做日期型別處理

解決:sql中將日期字串當做日期型別處理

敲機房中看著同期的人的部落格,學習儲存過程的使用,在查詢記錄和金額查詢這裡,擁有共同的窗體,所以自己就使用了模板方法+儲存過程!查詢日期的過程讓我遇到了問題。

實體中聲明瞭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 '
[email protected]
+' where DateTime between '[email protected]+' and '[email protected] 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 [email protected][email protected][email protected]
	set @cmdfiled2 [email protected][email protected][email protected]
	
	SET @TempSql= 'select * from '[email protected]+' where DateTime between '[email protected]+' and '[email protected]
	print @TempSql
    execute(@TempSql) 
end

最終的結果:

在宣告單引號時:注意

Set @smb ='''
--不能這樣寫,或許你會說,字串不是要用單引號括起來嗎?前後各需要一個單引號就可以,為什麼要加兩個
--答:
---:1.就近匹配,這樣想會認為前兩個單引號剛好一對,多出來的單引號就會報錯
---:2.所以沒有辦法只加一個單引號
---:3.所以,我就用前後放了一對單引號
---:4.這樣,內層的兩個單引號將值轉換為字元型
---:5.外層,外層用來標識裡面的內容為字串