簡體   English   中英

從字符串轉換日期和/或時間時轉換失敗

[英]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;

首先,您要計算todayyesterday錯誤。 這是正確的方法:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM