【问题标题】:SQL / How to sort values by their formatSQL / 如何按格式对值进行排序
【发布时间】:2017-12-17 05:11:18
【问题描述】:

我需要识别日期的几种格式中的哪一种。示例表:

在屏幕截图上(这是一个示例,但实际上有 120K+ 行),“DATEPRO”值可以具有三种不同的样式:

  • YYYY(第 1 行和第 2 行)

  • “FY”+YY/YY(第 3 行)

  • "In" +" "+M+"m"(第 4 行)

我想知道“DATEPRO”和“DATECON”之间是否存在超过一年的差异

如果 DATE PRO 是“FY”+YY/YY 样式,我会只考虑最后 2 个数字 (YY) 作为年份

如果 DATE PRO 是“In 3m”样式,那么显然是“否”

如果 DATE PRO 是 "YYYY" 样式,那将是一个简单的减法

例子:

  • "In 3m" 会自动给出 NO,

  • "2002" 与 "01/01/2001" 将给出 YES,

  • "2002" 与 "01/01/2002" 将给出 NO,

  • “FY02/03”对“01/02/03”将给出 NO,并且

  • "FY03/04" 与 "01/01/05" 将给出 YES

我觉得应该使用 CASE 操作符,但它似乎只适用于特定情况,并不能检测列的格式。 我真正的问题不是运算的减法部分,而是格式的识别。

【问题讨论】:

    标签: sql date format ms-access-2010 case


    【解决方案1】:

    此答案取决于您的数据包含您在问题中指定的那些格式,并且所有年份都至少为 2000,如果您依赖最后两位数FY 格式化值。

    CASE 在正确的轨道上,您可以在这种情况下使用它来识别格式,在这种情况下您知道自己拥有哪些有限的格式集。然后,您可以使用CASE 将错误格式的值转换为您需要的值。像这样:

    select 
    case 
        when left(DATEPRO,2) = 'FY' then concat('20', right(DATEPRO,2))
        when DATEPRO like '2___' then DATEPRO
        else null
        end
    as DATEFIX
    from your_table
    

    如果前两个字符是“FY”,则触发第一个检查。如果值以“2”开头并且正好是四个字符长,则第二次检查触发。 else null 清除了其他所有内容。

    但是,您的标签表明您正在使用不支持 CASE 的 MS Access。相反,它完全用IIF 替换它,它的功能是简化的CASEIIF 仅支持带有一个 if/else 条件的语句,因此您必须为此编写嵌套的 IFF 语句。写起来更难,读起来也更难。 Access 查询的等效代码是:

    select 
    IIF(
        left(DATEPRO,2) = 'FY'
        ,'20' & right(DATEPRO,2)
        ,IIF(
            DATEPRO like '2###',
            DATEPRO,
            null)
        )
    as DATEFIX
    from your_table
    

    【讨论】:

      【解决方案2】:

      你可以使用:

      Select 
          *,
          Not (Right(DatePro, 2) = Format(DateCon, "yy") Or Right(DatePro, 2) = "3m") As DateMatch
      From
          YourTable
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-29
        • 1970-01-01
        • 1970-01-01
        • 2013-08-17
        • 1970-01-01
        • 2022-12-18
        • 2020-11-05
        相关资源
        最近更新 更多