RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 557974
Accepted
Anatol
Anatol
Asked:2020-08-22 16:03:54 +0000 UTC2020-08-22 16:03:54 +0000 UTC 2020-08-22 16:03:54 +0000 UTC

SQL SERVER 日期格式问题(数据类型优先级)

  • 772

在客户端,我调用一个过程,根据传递的标志,返回

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()}    

这行得通,但如果它返回'нет информации',那么一切当然都会下降。

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. nick_n_a
    2020-08-22T16:45:30Z2020-08-22T16:45:30Z

    在第一个表达式中

    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  
    

    您没有将所有内容都包含在 convert 中(以粗体突出显示),因此您可以在这些情况下得到它"-" 。我会像这样做第一部分。也许您需要合并,它的工作方式类似于 isnull,但具有两个或三个或更多参数。

    select top 1 isnull(cast(convert(char(10), isnull(a.datprihod, 
    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 getdate() end) , 104 ) as varchar(20)),'нет информации');
    

    我忘了在这里再提一件事。在mssql中,先指定的类型先取。在你的表达式 'CASE WHEN a.datprihod IS NULL THEN CASE WHEN a.srok = 5 THEN b.fprminpricedue' 中,第一个变量fprminpricedue是 datetime 类型,这就是为什么不管 a.srok 即使 a.srok=1 日期使用“-”转换为标准的日期时间,即在转换后它仍然转换回日期时间并且常量通常会给出异常。

    • 1
  2. Best Answer
    Anatol
    2020-08-23T11:11:04Z2020-08-23T11:11:04Z

    事实证明,问题是我不知道SQL Server 数据类型优先级。

    如果一个运算符绑定两个不同数据类型的表达式,则数据类型优先级规则确定哪个数据类型具有较低的优先级,并将被转换为具有较高优先级的数据类型。如果不支持隐式转换,则返回错误。如果表达式的两个操作数具有相同的数据类型,则运算结果将具有相同的数据类型。

    类型NCHAR、CHAR和的优先级低于NVARCHAR和,这分别导致了让我感到困惑的结果。 VARCHARDATEDATETIME

    解决方案是将表达式所有分支的返回值类型转换为表达式CASE中使用的优先级最低的数据类型。

    示例
    请求

    SELECT CASE
               WHEN 1 > 0
               THEN CONVERT(CHAR(10), GETDATE(), 104)
               ELSE CAST(GETDATE() AS DATE)
           END;    
    

    会回来2016-08-23的。如果你删除第二个条件

    SELECT CASE
           WHEN 1 > 0
           THEN CONVERT(CHAR(10), GETDATE(), 104)
           -- ELSE CAST(GETDATE() AS DATE)
       END;    
    

    或将其返回值转换为优先级较低的类型(甚至不一定为CHAR)

    SELECT CASE
           WHEN 1 > 0
           THEN CONVERT(CHAR(10), GETDATE(), 104)
           ELSE CONVERT(BINARY, CAST(GETDATE() AS DATE))
       END;    
    

    然后我们得到我们想要的 - 23.08.2016。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5