【问题标题】:order by datetime dynamically按日期时间动态排序
【发布时间】:2015-08-06 07:46:22
【问题描述】:

我修改了如下代码:

declare @filterBy as nvarchar(255)  = 'C1'
declare @order as nvarchar(255)  = 'asc'
declare @globOrder as nvarchar(255) = 'CONVERT(DateTime, C3,101) ASC'


SELECT TOP (7000)

        [Project1].[IDC_IDCONTACT] AS [IDC_IDCONTACT], 
        [Project1].[C1] AS [C1], 
        [Project1].[C2] AS [C2], 
        [Project1].[ICP_PRENOM] AS [ICP_PRENOM], 
        [Project1].[IDC_NOSOC] AS [IDC_NOSOC], 
        [Project1].[C3] AS [C3], 
        [Project1].[C4] AS [C4], 
        [Project1].[C5] AS [C5], 
        [Project1].[ADC_CDPOSTAL] AS [ADC_CDPOSTAL], 
        [Project1].[ADC_VILLE] AS [ADC_VILLE], 
        [Project1].[Libelle] AS [Libelle], 
        [Project1].[Libelle1] AS [Libelle1]
        FROM ( SELECT [Project1].[IDC_IDCONTACT] AS [IDC_IDCONTACT], [Project1].[IDC_NOSOC] AS [IDC_NOSOC], [Project1].[ICP_PRENOM] AS [ICP_PRENOM], [Project1].[ADC_CDPOSTAL] AS [ADC_CDPOSTAL], [Project1].[ADC_VILLE] AS [ADC_VILLE], [Project1].[Libelle] AS [Libelle], [Project1].[Libelle1] AS [Libelle1], [Project1].[C1] AS [C1], [Project1].[C2] AS [C2], [Project1].[C3] AS [C3], [Project1].[C4] AS [C4], [Project1].[C5] AS [C5], row_number() OVER (ORDER BY CASE when @filterBy = 'DateNaissance' and @order = 'asc'  THEN CONVERT(DateTime, [Project1].C3,101) END asc , CASE when @filterBy = 'DateNaissance' and @order = 'desc'  THEN CONVERT(DateTime, [Project1].C3,101) END desc,CASE when @filterBy <> 'DateNaissance' and @order = 'asc'  THEN @filterBy END ASC , CASE when @filterBy <> 'DateNaissance' and @order = 'desc'  THEN @filterBy END desc) AS [row_number] , [Project1].profil AS prof
            FROM ( SELECT 
                [Extent1].[IDC_IDCONTACT] AS [IDC_IDCONTACT], 
                [Extent1].[IDC_NOSOC] AS [IDC_NOSOC], 
                [Extent2].[ICP_PRENOM] AS [ICP_PRENOM], 
                [Extent4].[ADC_CDPOSTAL] AS [ADC_CDPOSTAL], 
                [Extent4].[ADC_VILLE] AS [ADC_VILLE], 
                [Extent5].[Libelle] AS [Libelle], 
                [Extent6].[Libelle] AS [Libelle1], 
                [Extent1].[IDC_NOM] AS [C1], 
                [Extent2].[ICP_NMNAISS] AS [C2], 
                [Extent1].[IDC_CDPROFIL_CONTACT]  AS profil,
                 CAST( [Extent2].[ICP_DTNAISS] AS datetime2) AS [C3], 
                 CAST( [Extent3].[ICR_DTCREA_ENTREPRISE] AS datetime2) AS [C4], 
                CASE WHEN ([Extent1].[IDC_CDPORTEFEUILLE] IS NULL) THEN N'' ELSE  CAST( [Extent1].[IDC_CDPORTEFEUILLE] AS nvarchar(max)) END AS [C5]
                FROM      [mdw].[IDENTITE_CONTACT] AS [Extent1]
                LEFT OUTER JOIN [mdw].[IDENTITE_CONTACT_PHYSIQUE] AS [Extent2] ON [Extent1].[IDC_IDCONTACT] = [Extent2].[ICP_IDCONTACT] 
                LEFT OUTER JOIN [mdw].[IDENTITE_CONTACT_PROFESSIONNEL] AS [Extent3] ON [Extent1].[IDC_IDCONTACT] = [Extent3].[ICR_IDCONTACT]
                LEFT OUTER JOIN [mdw].[ADRESSE_CONTACT] AS [Extent4] ON [Extent1].[IDC_IDCONTACT] = [Extent4].[ADC_IDADR]
                LEFT OUTER JOIN [mdw].[Ref_Profil_Contact] AS [Extent5] ON [Extent1].[IDC_CDPROFIL_CONTACT] = [Extent5].[Cod]
                LEFT OUTER JOIN [mdw].[Ref_Statut] AS [Extent6] ON [Extent1].[IDC_CDSTATUTSOC] = [Extent6].[Cod]  WHERE IDC_CDPORTEFEUILLE IN (0108,0208,1808))  AS [Project1]
        )  AS [Project1]WHERE [Project1].[row_number]  > 0 

当@filterBy 的值为“DateNaissance”时它可以工作,但是当它取另一个值时它不工作,问题是我不能传递一个变量来排序

【问题讨论】:

  • 您的 DBMS 是哪个? (SQL Server、Oracle、MySql)
  • 我正在尝试从 SSMS 执行它
  • 请在查询中设置断点并尝试调试过程。
  • 看看这个link
  • 在case语句中添加@order。

标签: sql datetime sql-server-2012


【解决方案1】:

有两种情况是可能的:

ORDER BY
        CASE UPPER(@order)
        WHEN 'ASC'
        THEN CONVERT(DateTime, C3,101)
        END ASC,
        CASE UPPER(@order)
        WHEN 'DESC'
        THEN CONVERT(DateTime, C3,101)
        END DESC

这里已经回答了: DESCENDING/ASCENDING Parameter to a stored procedure

【讨论】:

    【解决方案2】:

    您不能在 order by 中使用 declare var。如果需要,您可以使用 CASE 语句,如下所示:

    ORDER BY
        CASE  
            WHEN @order = 'asc'
            THEN CONVERT(DateTime, C3,101) ASC
            WHEN @order = 'desc'
            THEN CONVERT(DateTime, C3,101)  DESC
        END
    

    【讨论】:

    • 他可以使用alias,你可能是说他不能使用变量,因为他使用它。
    • 可以使用别名,但不能使用 ASC 或 DESC 的变量。
    • 我评论文本“...您的订单中不能使用别名...” - 这不是真的@Vojtěch Dohnal。
    • 我如何使用别名?
    • 就像您在我的问题的编辑版本中看到的那样,我尝试了这个解决方案,它适用于 datetim,因为我提到了 colone(C3) 的名称,但不适用于另一个,因为我传递了一个变量(过滤依据)
    【解决方案3】:

    只需使用以下代码更改您的 row_number 逻辑行:

    将@order 声明为 nvarchar(255) = 'desc'
    将@filterBy 声明为 nvarchar(255) = 'C3'

        select row_number() OVER (ORDER BY CASE @filterBy WHEN 'DateNaissance' THEN CONVERT(DateTime, col1,101) + @order END  , @filterBy DESC) AS [row_number] ,col1
        from
        (select cast(GETDATE()AS datetime2) AS col1
        union all
        select cast(GETDATE()- 2 AS datetime2) AS col1) base
    

    您在案例结束后使用@order by,这是通过错误在 End 之前的案例中使用 order by 的正确方法

    【讨论】:

    • 这不起作用,我得到同样的错误:无法将日期时间转换为字符串
    • 我尝试创建有效的逻辑,如果您更改逻辑,我将编辑帖子并将逻辑发送给您,因为它会给出相同的错误。
    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多