我需要识别日期中的几种格式。示例表:
在截图中(这是一个例子,但在现实中有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运算符,但它似乎只适用于特定情况,而不是检测列的格式。 我真正的问题不是操作的减法部分,而是格式的识别。
答案 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
,其作为简化CASE
。 IIF
仅支持带有一个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