从字符串转换日期和/或时间时转换失败

时间:2012-10-16 05:00:24

标签: c# sql-server visual-studio-2010

我在SQL Server 2008中有一个查询。

SELECT
    CONVERT(char(80), i.InvDate,3) AS InvDate,
    i.InvoiceNo,
    i.TaxAmount + i.SubTotal AS Amount,
    '' AS Payment,
    pd.GivenName
FROM
dbo.Invoice i
    INNER JOIN dbo.PatientDetails pd ON (pd.MedicalRecordID = i.MedicalRecordID)
    WHERE (InvDate >= CONVERT(datetime, '16/10/2012', 105)) AND 
(InvDate <= CONVERT(datetime, '16/10/2012', 105))

输出:

http://i50.tinypic.com/1z6wfex.png

当我尝试将其放入C#时,它表示“从字符串转换日期和/或时间时转换失败。”


信息:16/10/2012是我尝试插入查询以确保其运行的示例日期。这是一个旧程序,这就是为什么它从字符串转换。我很确定它与日期时间格式有关。看看http://www.sqlusa.com/bestpractices/datetimeconversion/。但我不能指责它。

SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), i.InvDate,3) 

AS InvDate,

i.InvoiceNo, i.TaxAmount + i.SubTotal AS Amount,'' AS Payment,pd.GivenName 

FROM

dbo.Invoice i INNER JOIN dbo.PatientDetails pd

ON 
(pd.MedicalRecordID = i.MedicalRecordID)

WHERE

(InvDate >= CONVERT(datetime, 'dd/MM/yyyy', 105)) 

AND 

(InvDate <= CONVERT(datetime, 'dd/MM/yyyy', 105))", objConn);



        SqlDataReader objReader;
        objReader = objCmd.ExecuteReader();

        System.IO.FileStream fs = new System.IO.FileStream("C:\\CMSExportedData\\Sales-" + 
DateTime.Now.ToString("dd-MM-yyyy") + ".txt", System.IO.FileMode.Create);
        System.IO.StreamWriter sw = new System.IO.StreamWriter(fs,   
System.Text.Encoding.Default);

3 个答案:

答案 0 :(得分:1)

SQL code没有任何问题。如果你有多行字符串,你只需要在命令中的双引号之前@逐字字符串文字)。

SqlCommand objCmd = new SqlCommand(@"SELECT CONVERT(char(80), i.InvDate,3) AS InvDate,
               i.InvoiceNo, 
               i.TaxAmount +  i.SubTotal AS Amount,'' AS Payment,pd.GivenName 
FROM    dbo.Invoice i INNER JOIN dbo.PatientDetails pd
            ON (pd.MedicalRecordID = i.MedicalRecordID)
WHERE   (InvDate >= CONVERT(datetime, 'dd/MM/yyyy', 105)) AND 
        (InvDate <= CONVERT(datetime, 'dd/MM/yyyy', 105))", objConn);

答案 1 :(得分:1)

CONVERT(datetime, 'dd/MM/yyyy', 105)正在尝试将文字文本dd/MM/yyyy转换为datetime - 这是永远不会有用的。

SqlCommand objCmd = new SqlCommand(@"SELECT CONVERT(char(80), i.InvDate,3) 
AS InvDate,
i.InvoiceNo, i.TaxAmount + i.SubTotal AS Amount,'' AS Payment,pd.GivenName 
FROM
dbo.Invoice i INNER JOIN dbo.PatientDetails pd
ON 
(pd.MedicalRecordID = i.MedicalRecordID)
WHERE
(InvDate >= @StartDate) 
AND 
(InvDate <= @EndDate)", objConn);

objCmd.Parameters.AddWithValue("@StartDate",/* some C# expression that gives you the start date, as a DateTime value */);
objCmd.Parameters.AddWithValue("@EndDate",/* some C# expression that gives you the end date, as a DateTime value */);

您必须在上面的最后两行填写注释部分。我们可以previous questiondtpFrom.Value开始dtpTo.Value和{{1}}。

答案 2 :(得分:0)

我更愿意将查询移到存储过程并从Data Mapper类中调用存储过程。