日期列上的MySQL条件
有一个包含3个日期字段和ID的表,但定义如下日期列上的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
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如果到那时还没有得到答复,我将在几小时后回家时看一看。看起来像是矮人堡垒帮了我一个忙,使用第一个查询,将所有“日期”字段包装在更新查询中使用的同一铸造代码中。验证强制转换是否正常工作并返回正确的格式