我有一个小型 bash 函数运行良好,旨在检查滥用 MySQL 的日期有效性,因为它比使用 GNU 日期快得多。目的是以 YYYYmmdd 格式返回经过验证的日期,以用作其他命令的输入。这里:
function checkdate { for dd in $(seq $1 $2) ; do mysql -BNe "SELECT DATE_FORMAT($dd,'%Y%m%d')" | grep -v NULL ; done ; }
正如我已经评论过的那样,它工作得很好,但我发现必须使用 grep -v
过滤掉 NULL 值有点难看。
正如有人在这里请求 MCVE 一样,请准备好迎接极其复杂的输出!
SELECT DATE_FORMAT('20160228','%Y%m%d') ;
20160228
SELECT DATE_FORMAT('20160229','%Y%m%d') ;
NULL
谁能想到呢?但是等等,还有更多!这个看起来邪恶的 grep -v
在那里做什么?我的天啊!我们现在绝对需要一个 MCMVE,以保护星系不被人马座黑洞吸收:
echo NULL | grep NULL
NULL
echo NULL | grep -v 'NULL'
:tumbleweed:
请注意这个奇怪的单词grep
后面艺术地放置的-v
,很整洁,对吧?
所以,基本上该函数的作用是:
checkdate 20160227 20160231
20160227
20160228
20160229
就是这样。它返回一个有效日期列表(对我来说),格式为 YYYYmmdd,MySQL 的日期时间函数非常满意这种格式。
我的问题是:
有没有一种更优雅的方法可以在纯 SQL 中做到这一点,而不必重复使用 grep -v ?
最佳答案
很难相信这会更快。但如果你这样做:
SELECT COUNT(DATE_FORMAT($dd, '%Y%m%d'))
那么当它无效时你会得到 0,当它有效时你会得到 1。
关于mysql - 来自不带表的 SELECT 语句的非 NULL 日期时间值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43680470/