2012-10-11 101 views
2

我相信我的编码有些问题。我猜不是按日期过滤。请帮助从SQL Server和C#的输出不同

SQL代码:

SELECT 
    CONVERT(char(80), i.InvDate,3) AS InvDate, 
    i.InvoiceNo, 
    i.EmployerCode, 
    i.TaxAmount + i.SubTotal AS Amount, 
    '' AS Payment, 
    pd.GivenName 
FROM 
    dbo.Invoice i 
INNER JOIN 
    dbo.PatientDetails pd ON (pd.MedicalRecordID = i.MedicalRecordID) 

C#代码:

SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), i.InvDate,3) AS InvDate, 
    i.InvoiceNo, 
    i.EmployerCode, 
    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, '" + dtpFrom.Text + "', 105)) 
    AND (InvDate <= CONVERT(datetime, '" + dtpTo.Text + "', 105))," , objConn); 

这就是我想要达到的目标:

http://i47.tinypic.com/167trt3.png

这就是我得到:

http://i50.tinypic.com/28m2z5x.png

在我被踢出这里之前。我会做一些编辑。

编辑:

日期时间处于105格式(DD-MM-YYYY)

WHERE (InvDate >= CONVERT(datetime, '" + dtpFrom.Text + "', 105)) 
AND (InvDate <= CONVERT(datetime, '" + dtpTo.Text + "', 105)) 

这应该从一个特定的日期选择。 EG:从11月2012到2012年15月

即使没有dateTimePicker的,输出不告诉我“给定名称”

+2

你VB代码看起来像C#代码 – Habib

+0

对不起有关更改标签:) – Newbie

+2

如何你的SQL代码与你的VB代码有关?如果它们意图相同,那么您的SQL代码中没有存在于您的VB代码中的WHERE子句, – rikitikitik

回答

1

,最好的办法是格式化你的DD /输入MMM/yyyy格式。它更好地帮助SqlServer识别月份和日期。无论何时与SqlServer通信,我都强烈建议使用MMM格式。

DateTime fromDate, toDate; 
fromDate = DateTime.Parse(dtpFrom.Text); 
toDate = DateTime.Parse(dtpTo.Text); 

SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), i.InvDate,3) AS InvDate, 
i.InvoiceNo, 
i.EmployerCode, 
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 datediff(d, '" + fromDate.ToString("dd/MMM/yyyy") + "', i.InvDate) >=0 
AND datediff(d, '" + toDate.ToString("dd/MMM/yyyy") + "', i.InvDate) <=0", objConn); 

,或者如果您有任何约束上,按上述,转换使用输入CONVERT()

SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), i.InvDate,3) AS InvDate, 
i.InvoiceNo, 
i.EmployerCode, 
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 datediff(d, CONVERT(datetime, '" + dtpFrom.Text + "', 105), i.InvDate) >=0 
AND datediff(d, CONVERT(datetime, '" + dtpTo.Text + "', 105), i.InvDate) <=0", objConn); 
+0

嗨@vinodpthmn, 当我使用MMM格式时,它会抛出一个''字符串未被识别为有效的DateTime“错误。 当我使用你的第二个选项时,打印输出和以前一样,不会在txt文件中显示我pd.GivenName。 – Newbie

+0

我会尝试改变配置文件中的全球化,看看是否有效。 – Newbie

+0

“字符串未被识别为有效的DateTime”错误是因为您在dtpFrom/dtpTo中传递了无效值。你可以尝试DateTime.TryParse(),第二个选项也是不工作的,因为同样的原因。请检查dtpFrom/dtpTo中的值,确保您传递的是正确的日期时间。 – eka

-1

的问题是由于日期类型为char的转换,过滤可能无法正常工作如你所料。尝试使用datediff,它会诀窍。

SqlCommand objCmd = new SqlCommand("SELECT CONVERT(char(80), i.InvDate,3) AS InvDate, 
i.InvoiceNo, 
i.EmployerCode, 
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 datediff(d, '" + dtpFrom.Text + "', i.InvDate) >=0 
AND datediff(d, '" + dtpTo.Text + "', i.InvDate) <=0", objConn); 
+0

嗨,先生,扔我一个错误不正确的语法。 – Newbie

+0

嗨,这是由于错字错误(附加逗号为零),从上面的答案中删除 - 请再试一次 – eka

+0

嗨@vinodpthmn,谢谢你帮助我。但它给了我另一个错误。将varchar数据类型转换为日期时间数据类型导致超出范围的值。如果我没有错,它没有指定我需要的ISO 105。 – Newbie