SQL /如何按格式

时间:2017-07-12 16:41:07

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

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

the table i need to work on

在截图中(这是一个例子,但在现实中有120K +行),'DATEPRO'值可以有三种不同的样式:

  • YYYY(第1和第2行)

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

  • “在”+“”+ M +“m”(第4行)

我想知道'DATEPRO'和'DATECON'之间是否有一年以上的差异

如果DATE PRO为“FY”+ YY / YY风格,我只考虑最后2位数(YY)作为一年

如果DATE PRO为“3米”风格,那么由于显而易见的原因,它将为“否”

如果DATE PRO是“YYYY”风格,那将是一个简单的减法

示例:

  • “在3米内”会自动给出NO,

  • “2002”对“01/01/2001”会给出YES,

  • “2002”对“01/01/2002”将给予NO,

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

  • “FY03 / 04”对“01/01/05”会给出

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

2 个答案:

答案 0 :(得分: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除掉了其他所有内容。

但是,您的代码表明您正在使用MS Access,但不支持CASE。相反,它完全将其替换为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

答案 1 :(得分:0)

您可以使用:

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