在客户端,我调用一个过程,根据传递的标志,返回
SELECT TOP 1 CASE
WHEN a.datprihod IS NULL
THEN CASE
WHEN a.srok = 5
THEN b.fprminpricedue
WHEN a.srok = 6
THEN b.fprminduepricedue
WHEN a.srok = 7
THEN b.fprminpriceduewithdue
WHEN a.srok = 1
THEN RTRIM(CONVERT( NCHAR, GETDATE(), 104))
ELSE 'нет информации'
END
ELSE RTRIM(CONVERT(NCHAR, a.datprihod, 104))
END
, 或者
SELECT ISNULL(sbd.ItemName,
(
SELECT Name
FROM dbo.pct_ItemType
WHERE pkid = sbd.IDItem
)),
RTRIM(CAST(dbo.ufn_sls_GetBillDetRubItemPrice(sbd.PKID) AS NCHAR))+N'₽',
CAST(sbd.Quantity AS NCHAR),
RTRIM(CAST(dbo.ufn_sls_GetBillDetRubItemPrice(sbd.PKID)*sbd.Quantity AS NCHAR))+N'₽',
ISNULL(sbd.status,
CASE
WHEN sbd.datprihod IS NULL
THEN CASE
WHEN sbd.srok = 5
THEN b.fprminpricedue
WHEN sbd.srok = 6
THEN b.fprminduepricedue
WHEN sbd.srok = 7
THEN b.fprminpriceduewithdue
WHEN sbd.srok = 1
THEN RTRIM(CONVERT( NCHAR, GETDATE(), 104))
ELSE 'нет информации'
END
ELSE RTRIM(CONVERT( NCHAR, sbd.datprihod, 104))
END)
我希望收到22.08.2016。
第一种情况:
得到22.08.2016 00:00:00
第二种情况:
得到2016-08-22
我为同一个客户得到如此不同的结果。
客户端的处理如下:
using (var items = await comm.ExecuteReaderAsync())
{
while (await items.ReadAsync())
{
Console.Write($"Наименование - {items[0]}, \nДата - {items[1]}");
}
}
尝试在表单中进行显式转换
{((DateTime)items[1]).ToShortDateString()}
这行得通,但如果它返回'нет информации',那么一切当然都会下降。
在第一个表达式中
您没有将所有内容都包含在 convert 中(以粗体突出显示),因此您可以在这些情况下得到它
"-"。我会像这样做第一部分。也许您需要合并,它的工作方式类似于 isnull,但具有两个或三个或更多参数。我忘了在这里再提一件事。在mssql中,先指定的类型先取。在你的表达式 'CASE WHEN a.datprihod IS NULL THEN CASE WHEN a.srok = 5 THEN b.fprminpricedue' 中,第一个变量fprminpricedue是 datetime 类型,这就是为什么不管 a.srok 即使 a.srok=1 日期使用“-”转换为标准的日期时间,即在转换后它仍然转换回日期时间并且常量通常会给出异常。
事实证明,问题是我不知道SQL Server 数据类型优先级。
类型
NCHAR、CHAR和的优先级低于NVARCHAR和,这分别导致了让我感到困惑的结果。VARCHARDATEDATETIME解决方案是将表达式所有分支的返回值类型转换为表达式
CASE中使用的优先级最低的数据类型。示例
请求
会回来
2016-08-23的。如果你删除第二个条件或将其返回值转换为优先级较低的类型(甚至不一定为
CHAR)然后我们得到我们想要的 -
23.08.2016。