日期列上的MySQL条件

日期列上的MySQL条件,mysql,Mysql,有一个包含3个日期字段和ID的表,但定义如下 invoice_date varchar(255) ---- 2012-04-06 00:00:00 (data stored as) end_date varchar(255) ----2012-06-30 00:00:00 transaction_date int(11) --- 20120630 对于invoice_date和velocity_date,很少有记录使用“”(空字符串)而不是“NULL” 我的要求是获得20101和201403

有一个包含3个日期字段和ID的表,但定义如下

invoice_date  varchar(255) ---- 2012-04-06 00:00:00 (data stored as)
end_date varchar(255) ----2012-06-30 00:00:00
transaction_date int(11) --- 20120630
对于invoice_date和velocity_date,很少有记录使用“”(空字符串)而不是“NULL”

我的要求是获得20101和20140331之间的记录

1. if Invoice_date <> '' then use invoice_date
2. If (Invoice_date = ''  and end_date <> '') then use end_date 
3. if (Invoice_date = ''  and velocity_date = '') then use transaction_date

SELECT DISTINCT 
ID,
invoice_date ,
end_date, 
transaction_date
FROM
  temp
WHERE 
CASE
WHEN invoice_date <> '' 
     THEN DATE_FORMAT(CAST(`invoice_date` AS DATE),'%Y%m%d') 
      BETWEEN        20120101 AND 20140331 
WHEN invoice_date = '' AND end_date > '' 
     THEN DATE_FORMAT(CAST(end_date AS DATE),'%Y%m%d') 
      BETWEEN CAST('20120101' AS DATE) AND CAST('20140331' AS DATE) 
WHEN (
      invoice_date = '' 
      AND end_date = ''
    ) 
    OR (
      end_date IS NULL 
      AND invoice_date = ''
    ) 
    OR (
      end_date = '' 
      AND invoice_date IS NULL
       ) 
    THEN DATE_FORMAT(CAST(`transaction_date` AS DATE),'%Y%m%d') BETWEEN 20120101 
    AND 20140331 
  END;
1。如果发票日期为“”,则使用发票日期
2.如果(发票日期=“”和结束日期“”),则使用结束日期
3.如果(发票日期=''和velocity日期=''),则使用事务日期
选择不同的
身份证件
发票日期,
结束日期,
交易日
从…起
临时雇员
哪里
案例
当发票日期为“”时
然后是日期格式(强制转换(“发票日期”为日期),“%Y%m%d”)
在20101和20140331之间
当发票日期=''和结束日期>''时
然后是日期格式(强制转换(结束日期为日期),“%Y%m%d”)
在CAST(日期为20101)和CAST(日期为20140331)之间
什么时候(
发票日期=“”
和结束日期=“”
) 
或(
结束日期为空
发票日期=“”
) 
或(
结束日期=“”
发票日期为空
) 
然后是日期格式(CAST(`transaction_DATE`AS DATE),'%Y%m%d')在20101之间
和20140331
终止
在选择和插入之后,在下一步中,我必须根据上面的日期列进行更新,所以我必须在一个语句中使用这3列对表进行内部联接,如

Update table_A Inner Join temp
on (CASE
WHEN invoice_date <> '' 
     THEN DATE_FORMAT(CAST(`invoice_date` AS DATE),'%Y%m%d') 
      BETWEEN        20120101 AND 20140331 
WHEN invoice_date = '' AND end_date > '' 
     THEN DATE_FORMAT(CAST(end_date AS DATE),'%Y%m%d') 
      BETWEEN CAST('20120101' AS DATE) AND CAST('20140331' AS DATE) 
WHEN (
      invoice_date = '' 
      AND end_date = ''
    ) 
    OR (
      end_date IS NULL 
      AND invoice_date = ''
    ) 
    OR (
      end_date = '' 
      AND invoice_date IS NULL
       ) 
    THEN DATE_FORMAT(CAST(`transaction_date` AS DATE),'%Y%m%d') BETWEEN 20120101 
    AND 20140331 
  END = date_id)
  set .........
更新表\u内部联接温度
关于(案件)
当发票日期为“”时
然后是日期格式(强制转换(“发票日期”为日期),“%Y%m%d”)
在20101和20140331之间
当发票日期=''和结束日期>''时
然后是日期格式(强制转换(结束日期为日期),“%Y%m%d”)
在CAST(日期为20101)和CAST(日期为20140331)之间
什么时候(
发票日期=“”
和结束日期=“”
) 
或(
结束日期为空
发票日期=“”
) 
或(
结束日期=“”
发票日期为空
) 
然后是日期格式(CAST(`transaction_DATE`AS DATE),'%Y%m%d')在20101之间
和20140331
结束=日期(id)
设置
是这样吗?因为上面的case语句返回为“1”(而不是日期字段)

让我知道,我遗漏了什么或有什么新的方法可以遵循


谢谢大家

MySQL有一个日期类型和很多函数设计用来操作日期类型…为什么要使用varchar和int?这是一个遗留系统,我现在不能更改。我理解…现在我们正在构建新系统。处理所有这些问题。为了获得生成报告所需的数据,除了使用相同的遗留系统列之外,我没有其他选择。@Sql\U Learner如果到那时还没有得到答复,我将在几小时后回家时看一看。看起来像是矮人堡垒帮了我一个忙,使用第一个查询,将所有“日期”字段包装在更新查询中使用的同一铸造代码中。验证强制转换是否正常工作并返回正确的格式