[英]Conversion failed when converting date and/or time from character string
我正在嘗試查詢日期在今天和昨天之間的數據庫,但是在從字符串轉換日期和/或時間時遇到錯誤,提示轉換失敗。
我的查詢下面是今天和昨天的參數
string today = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day).ToString("yyyy-MM-dd");
string yesterday= new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day-1).ToString("yyyy-MM-dd");
string errorsPerHourQuery = "WITH data_CTE(ErrorDay)" +
"AS(" +
"SELECT DATEPART(hh, Date) AS ErrorDay FROM cloud.ErrorLog " +
"WHERE Date BETWEEN '@yesterday' AND '@today' " +
"AND CAST(Message AS varchar(200)) ='@message'"+
")" +
"SELECT ErrorDay, COUNT(*) AS count FROM data_CTE GROUP BY ErrorDay ORDER BY ErrorDay";
conn.Open();
cmd.Parameters.AddWithValue("@message", message);
cmd.Parameters.AddWithValue("@yesterday", yesterday);
cmd.Parameters.AddWithValue("@today", today);
cmd.CommandType = CommandType.Text;
首先,您要計算today
和yesterday
錯誤。 這是正確的方法:
var today = DateTime.Today;
var yesterday = today.AddDays(-1);
並重新查詢:刪除命名參數周圍的...BETWEEN @yesterday and @today...
( '
),這樣您的查詢將讀取...BETWEEN @yesterday and @today...
,一切...BETWEEN @yesterday and @today...
。
您必須從查詢的參數中刪除簡單的cote '
:
..BETWEEN @yesterday AND @today
您無需使用特定格式創建今天和昨天的內容,只需獲取類似以下內容的變量:
var today = DateTime.Today;
var yesterday = DateTime.Today.AddDays(-1);
並在SqlDbType.DateTime
使用Parameter,然后將DateTime直接傳遞給該參數(無需轉換)。
cmd.Parameters.Add("@yesterday", SqlDbType.DateTime).Value = yesterday
cmd.Parameters.Add("@today", SqlDbType.DateTime).Value = today
問題是您引用的命令參數被視為字符串文字,而不是如下所示的參數。
WHERE Date BETWEEN '@yesterday' AND '@today'
您應該將其更改為
WHERE [Date] BETWEEN @yesterday AND @today
特別是在其他答案中有很多優點。 @Abdellah在教導datetime
數據類型和適當的值方面做得很好,但是您的SQL查詢本身需要工作,這可能就是為什么您沒有得到想要的東西。 因為就像@yesterday
和@today
一樣,您需要從@message
刪除``(ticks)”。 然后,您可以在不需要cte的第一步中進行查詢。 另外,如果您不打算傳遞除昨天或今天以外的任何日期,則不需要使用SQL的內置函數的參數。
因此,刪除所有參數周圍的所有刻度(@yest ...)
這是一個適合您的SQL查詢:
SELECT
ErrorHour = DATEPART(HH,[Date])
,[Count] = COUNT(*)
FROM
cloud.ErrorLog
WHERE
--use this line from midnight yesterday to midnight today
CAST([Date] AS DATE) BETWEEN CAST(GETDATE() - 1) AND CAST(GETDATE())
--what is the datatype for message does it really need to be cast?
AND CAST([Message] AS VARCHAR(200)) = @Message
GROUP BY
DATEPART(HH,[Date])
ORDER BY
ErrorHour
注意,我把ErrorHour
放到了ErrorDay
,但是您是在ErrorDay
計數錯誤,而不是幾天,要更改計數,只需將DATEPART()
更改為您想要的時間部分,例如分鍾等等。
下一步您是否真的需要投射消息字段?
在日期上。 您想要今天和昨天還是真的想要昨天的一切? 如果是昨天,則將此行交換到另一個日期行的查詢中:
-如果您真的只想昨天午夜至晚上11:59:59,則應為CAST([Date] AS DATE)= CAST(GETDATE()-1 AS DATE)
接下來,如果您確實真的想將昨天和今天作為參數傳遞,並且想要昨天和今天的所有內容執行以下操作,並按照其他文章的建議更新代碼中的參數定義。
-從昨天的午夜到今天的午夜使用此行,在CAST(@yesterday AS DATE)和CAST(@Today AS DATE)之間
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.