【问题标题】:how to fetch varchar date column with given date values如何获取具有给定日期值的 varchar 日期列
【发布时间】:2018-07-03 09:31:45
【问题描述】:

我有一张桌子。其中,列名是 tb_date,是 varchar 格式。在该列中保存日期,但格式不同(例如:01/07/201 或 01-08-2018 或 2017/03/12 等)。现在我想在给定日期之间进行搜索。但它不起作用。我试过了-

$result=mysql_query("select * from user_History") or die(mysql_error());
while($row=mysql_fetch_array($result))
{
extract($row);
$time = strtotime( $tb_date );
$myDate = date( 'd/m/y', $time );

$result1=mysql_query("select * from user_History where '$myDate' BETWEEN '01/06/2018' AND '31/06/2018'") or die(mysql_error()); 
while($row1=mysql_fetch_array($result1))
{
    extract($row1);

    echo $tb_date;
    }                   
    }

但它提供了所有记录。

【问题讨论】:

    标签: php mysql sql ajax mysqli


    【解决方案1】:

    假设你在 Mysql 中的日期值类型为 DATE 你应该在 Sql 语句中以 YYYY-MM-DD 的格式给出它。

    改变

    select * from user_History where '$myDate' BETWEEN '01/06/2018' AND '31/06/2018'
    

    select * from user_History where `[DATE_COLUMN_NAME]` BETWEEN '2018-06-01' AND '2018-06-31'
    

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回复。但错误是在“where 子句”中给出未知列“1970197019701970-JanJan-ThuThu”
    • 对不起。我的错。编辑了答案。现在看第二个陈述。将 [DATE_COLUMN_NAME] 替换为包含表中日期的字段名称。
    • 现在连续运行超过2分钟。
    • 如何在字段中存储值?换句话说,保存日期值的字段的数据类型是什么?
    • tb_date 列的数据类型为 varchar
    【解决方案2】:

    您可以使用此 IF 语句来转换此日期格式,但这不是最好的主意。更好的方法是规范化这个字段:

    IF( tb_date REGEXP '^[0-9]{4}/[0-9]{2}/[0-9]{2}$', str_to_date(tb_date,'%Y/%m/%d'),
    IF( tb_date REGEXP '^[0-9]{2}/[0-9]{2}/[0-9]{4}$', str_to_date(tb_date,'%d/%m/%Y'),
    IF( tb_date REGEXP '^[0-9]{2}-[0-9]{2}-[0-9]{4}$', str_to_date(tb_date,'%d-%m-%Y') , 'ERROR'))) tb_date_new
    

    样本

    MariaDB [bernd]> SELECT * from user_History;
    +----+------------+------------+
    | id | tb_date    | some-field |
    +----+------------+------------+
    |  1 | 01/07/2014 | Line 1     |
    |  2 | 01-08-2018 | Line 2     |
    |  3 | 2017/03/12 | Line 3     |
    +----+------------+------------+
    3 rows in set (0.00 sec)
    
    
    MariaDB [bernd]> SELECT u.*,
        -> IF( tb_date REGEXP '^[0-9]{4}/[0-9]{2}/[0-9]{2}$', str_to_date(tb_date,'%Y/%m/%d'),
        -> IF( tb_date REGEXP '^[0-9]{2}/[0-9]{2}/[0-9]{4}$', str_to_date(tb_date,'%d/%m/%Y'),
        -> IF( tb_date REGEXP '^[0-9]{2}-[0-9]{2}-[0-9]{4}$', str_to_date(tb_date,'%d-%m-%Y') , 'ERROR'))) tb_date_new
        -> FROM user_History u
        -> ;
    +----+------------+------------+-------------+
    | id | tb_date    | some-field | tb_date_new |
    +----+------------+------------+-------------+
    |  1 | 01/07/2014 | Line 1     | 2014-07-01  |
    |  2 | 01-08-2018 | Line 2     | 2018-08-01  |
    |  3 | 2017/03/12 | Line 3     | 2017-03-12  |
    +----+------------+------------+-------------+
    3 rows in set (0.00 sec)
    
    MariaDB [bernd]> SELECT u.*,
        -> IF( tb_date REGEXP '^[0-9]{4}/[0-9]{2}/[0-9]{2}$', str_to_date(tb_date,'%Y/%m/%d'),
        -> IF( tb_date REGEXP '^[0-9]{2}/[0-9]{2}/[0-9]{4}$', str_to_date(tb_date,'%d/%m/%Y'),
        -> IF( tb_date REGEXP '^[0-9]{2}-[0-9]{2}-[0-9]{4}$', str_to_date(tb_date,'%d-%m-%Y') , 'ERROR'))) tb_date_new
        -> FROM user_History u
        ->
        -> WHERE
        -> IF( tb_date REGEXP '^[0-9]{4}/[0-9]{2}/[0-9]{2}$', str_to_date(tb_date,'%Y/%m/%d'),
        -> IF( tb_date REGEXP '^[0-9]{2}/[0-9]{2}/[0-9]{4}$', str_to_date(tb_date,'%d/%m/%Y'),
        -> IF( tb_date REGEXP '^[0-9]{2}-[0-9]{2}-[0-9]{4}$', str_to_date(tb_date,'%d-%m-%Y') , 'ERROR')))
        -> BETWEEN str_to_date('01/06/2018','%d/%m/%Y') AND str_to_date('31/08/2018','%d/%m/%Y');
    +----+------------+------------+-------------+
    | id | tb_date    | some-field | tb_date_new |
    +----+------------+------------+-------------+
    |  2 | 01-08-2018 | Line 2     | 2018-08-01  |
    +----+------------+------------+-------------+
    1 row in set (0.00 sec)
    
    MariaDB [bernd]>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多