【问题标题】:MYSQL - Using CURDATE() in a WHERE BETWEEN returns NULLMYSQL - 在 WHERE BETWEEN 中使用 CURDATE() 返回 NULL
【发布时间】:2014-09-11 13:17:31
【问题描述】:

尝试使用 CURDATE() 过滤过去 30 天,但它只是返回一个 NULL 行。

查询:

SELECT

vcrs.vcrDate AS DATE,
vcrs.jobNumber AS RO_NUM,
vhcrows.description AS DESC,
vhcrows.partNumber AS PART_NUM,
vhcrows.unitPrice AS UNIT_PRICE,
vhcrows.partQuantity AS QUANTITY,

FROM vhcrows 
INNER JOIN vcrs ON vhcrows.vcr_id = vcrs.uid
INNER JOIN usergroup_manufacturers ON usergroup_manufacturers.usergroup_id = usergroups.uid

WHERE usergroup_manufacturers.manufacturer_id = 7
AND vcrs.vcrDate BETWEEN DATE_FORMAT((CURDATE()),'%Y%m%d') AND DATE_FORMAT((CURDATE() - INTERVAL 30 DAY),'%Y%m%d')
AND vcrs.vcrStatus <> '-1'
AND vcrs.vcrSubStatus = 4
AND vhcrows.rowType IN (1,2);

它应该返回如下内容:

DATE        RO_NUM   DESC                   UNIT_PRICE  QUANTITY
20140805    36815    BALL JOINT             24.85       1
20140821    11763    BALL JOINT             31.4        1
20140806    12076    BOLT                   4.44        2
20140806    12076    BOLT                   4.44        2
20140828    37994    DEF WIPER              9.53        3
20140804    11536    DRIVE MEMBER           106.42      1
20140804    11536    DRIVESHAFT             280.78      1
20140805    36815    NUT                    1.33        1
20140813    56817    RADIO WITH CD PLAYER   1399.88     1
20140820    203102   REF.                   16.7        1
20140801    11517    TENSIONER              64.01       1
20140814    12203    WHEEL BEARING          162.13      1
20140807    51520    WIPER                  9.53        3
20140821    198081   "RANGE"                22.77       1

但是,正如我所说,我只是得到 NULL。

谢谢!

* vcrs.vcrDate 存储为例如20140911 *

【问题讨论】:

  • 你看到 (CURDATE()),'%Y%m%d') 返回什么或者它是否为空?
  • SELECT DATE_FORMAT((CURDATE()),'%Y%m%d');返回 20140911
  • curDate 的格式是什么?它应该是一个日期。
  • 数据库中的日期采用 YYYYMMDD 格式,因此我使用 DATE_FORMAT 将 CURDATE() 与数据库格式匹配。否则返回 YYYY-MM-DD
  • 如果您使用手动输入的日期范围 IE BETWEEN '20140911' AND '20140811' 进行测试会发生什么? - 如果它也出错了,请尝试在“2014-09-11”和“2014-08-11”之间添加“-”IE(您可能必须以相同的方式格式化vcrDate)

标签: mysql date null where between


【解决方案1】:

为什么要将CURDATE() 转换为字符串?做吧:

vcrs.vcrDate BETWEEN CURDATE()) AND CURDATE() - INTERVAL 30 DAY

这假定vcrDate 以本机日期格式存储。如果没有,请编辑您的问题并说明它是如何存储的。

如果vcrs.vcrDate 实际上是一个整数,那么你希望你的CURDATE() 是一个整数。您可以采用与您相同的路径,但最终转换为整数:

vcrs.vcrDate BETWEEN cast(DATE_FORMAT((CURDATE()),'%Y%m%d') as unsigned) AND
                     cast(DATE_FORMAT((CURDATE() - INTERVAL 30 DAY),'%Y%m%d') as unsigned)

【讨论】:

  • Gordon - 日期格式为 yyyymmdd - 在示例输出中。
  • 问题已编辑,尝试使用 cast() 作为未签名的建议,仍然返回 NULL
  • @Giles 。 . .列的类型是什么?
  • 我假设 char 或(不太可能)int - 我不认为这是日期,因为简单的选择会返回带有“-”分隔符的日期类型。
  • MySQL 有非常有趣的规则将日期转换为字符串和整数。您确实应该将该值存储为本机日期/时间格式。因为你不是,我会推荐非常明确的转换。
【解决方案2】:

需要重新格式化 vcrs.vcrDate 而不是 CURDATE():

AND DATE_FORMAT(vcrs.vcrDate,'%Y-%m-%d') BETWEEN SUBDATE(CURDATE(), INTERVAL 30 DAY) AND CURDATE()

感谢 Giles 和 Gordon Linoff 的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多