【问题标题】:STR_TO_DATE not working in my querySTR_TO_DATE 在我的查询中不起作用
【发布时间】:2016-03-02 07:31:20
【问题描述】:

我在数据库中有日期字段具有 varchar 数据类型。现在我必须将日期与当前日期进行比较,但由于数据类型(varchar)结果不正确。

我不想更改数据库中的数据类型,那么如何在 codeigniter 中查询?

在我的数据库中,日期是这种格式 30/11/2015

我当前的查询:

    //here vd is table field(one column).

    $cd = date('d/m/Y');//current date

    $this->db->where("date_format(STR_TO_DATE(vd, '%d/%m/%Y'),'%d/%m/%Y') >",$cd); //comparing date with current date
    $query =$this->db->get('warranty');

通过使用上述查询,它只是比较日期而不是月份和年份。所以它返回那些日期大于今天日期的记录。

但正确的结果并没有到来......

【问题讨论】:

  • 不,这不是问题。我只在这里写了“日期”。但字段类型是 varchar 而不是日期,所以我无法比较日期。
  • 不,'PD' 表示过去的日期
  • 我可以在这个查询中使用 cast 列吗?如果是,那么如何?
  • 不需要使用cast,而是使用'str_to_date(PD,"%d-%m-%Y") >'
  • 谢谢兄弟...这意味着我的条件应该是 $this->db->where('str_to_date(PD,"%d-%m-%Y") >',$cd) ; ??????

标签: php mysql codeigniter


【解决方案1】:
**Hope this may help you...**

$cd = date('d/m/Y');

$data['project'] = $this->common_model->selectRecord("SELECT * from project where project_date = '.$cd.'");

 in my project this is working ..

【讨论】:

  • 但在数据库中,日期以 varchar 数据类型存储
  • $cd = date('d/m/Y'); $this->db->where(vd >,"$cd"); $query =$this->db->get('warranty');试试这个它有效
  • SELECT * FROM warranty 其中 vd > 10/11/2015 。在你的 MySQL 中尝试这个查询
  • SELECT * FROM events WHERE FORMAT( START , 'DD/MM/YYYY' ) > "25/11/2015" LIMIT 0 , 30 我试过这个并且工作正常
【解决方案2】:

试试这个:

$cd = date('d.m.Y');//current date

$this->db->where("STR_TO_DATE(vd, '%d.%m.%Y') >",$cd);
$query =$this->db->get('warranty');

为确保以您想要的格式输出,请使用 DATE_FORMAT:

$cd = date('d.m.Y');//current date

$this->db->where("DATE_FORMAT(STR_TO_DATE(vd, '%d.%m.%Y'),'%d.%m.%Y') >",$cd);
$query =$this->db->get('warranty');

【讨论】:

  • 尝试使用strtotime。我修改了答案。
  • 错误号:1305 FUNCTION tablename.strtotime 不存在
  • 抱歉,刚刚又修改了。
  • 尝试使用 FALSE 作为第三个参数。我修改了答案。
  • 如果我使用 false,它会返回所有记录
【解决方案3】:

您能否手动检查此查询。然后尝试添加到CodeIgniter

$cd = date('d/m/Y');//current date

select * FROM warranty WHERE DATE_FORMAT(STR_TO_DATE(vd, '%d/%m/%Y'), '%Y-%m-%d') > DATE_FORMAT(STR_TO_DATE($cd, '%d/%m/%Y'), '%Y-%m-%d')

【讨论】:

  • @DeepParekh 有没有满足这种条件的记录。也手动执行?
  • 是的,在数据​​库中有一条记录满足所有条件,我已经仔细检查了那个东西
【解决方案4】:

你尝试过 CAST 吗?

SELECT * FROM warranty WHERE CAST(vd AS DATE) ....;

你试过 DATE 吗?

SELECT * FROM warranty WHERE DATE(vd) ....;

【讨论】:

  • 你的问题真的很奇怪。你能只导出保修表和两行或更多行吗?只是为了尝试我的本地实例。
  • 创建只有两个字段的表。 vdate(varchar(25)) 和 id(int(11))。插入两个三个记录。但日期应为 d/m/Y (1/12/2015) 格式。
【解决方案5】:

改变这个

$this->db->where("date_format(STR_TO_DATE(vd, '%d/%m/%Y'),'%d/%m/%Y') >",$cd);

$this->db->where("STR_TO_DATE(vd, '%d/%m/%Y') > NOW()");

【讨论】:

    【解决方案6】:

    在您的代码中,您使用两个函数来重构日期格式。

    1. date_format
    2. STR_TO_DATE

    使用STR_TO_DATE

    $now = date('d/m/Y'); //current date
    $userdate = '2009-05-18 22:23:00'; //which get from user inputs
    
    $dateModified = STR_TO_DATE($userdate,'%d/%m/%Y'); //output is 2009-05-18
    

    所以在函数中

    $this->db->where('order_date >=', $dateModified);
    $this->db->where('order_date <=', $now);
    $query =$this->db->get('warranty');
    

    $this->db->where('order_date BETWEEN '.$dateModified.' and '.$now);
    

    此功能将为您提供 userSearch 输入的结果和到现在的日期。这个函数就像 MySQL 中的 between 一样


    【讨论】:

    • 谢谢,但我的问题不同。我没有用户输入日期。我只需要检查当前日期。但在数据库中,日期以 varchar 数据类型存储,因此结果不正确。
    • 所以你的结果不会出现。将您的数据库字段更改为DATETIME
    • 不,我不能。因为该表中有很多数据。所以如果我更改数据类型,它会将数据(日期字段)更改为 0000-00-00
    • 如果您现在执行此操作,则没有任何危害。但是,当您托管并在线项目时,您必须三思而后行。 根本不是好主意
    • 将所有数据存入CSV并清除数据库。更改类型并导入它。游戏结束
    【解决方案7】:

    试试这个可能对你有帮助:

    $cd = date('Y-m-d');
    
    $this->db->where("date_format(STR_TO_DATE(vd, '%d/%m/%Y'),'%Y-%m-%d') >",$cd);
    $query =$this->db->get('warranty');
    

    如果您在查询中使用 date_format 您需要更改日期格式,您正在更改相同的格式,这可能是它不起作用的原因。尝试更改并以 Y-m-d 格式进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 2018-03-28
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 2013-09-10
      相关资源
      最近更新 更多