【问题标题】:Convert varchar to date in where clause在 where 子句中将 varchar 转换为日期
【发布时间】:2014-04-15 09:30:03
【问题描述】:
function details_klanten($idKlant,$start,$eind){
    $this->db->select(' Project.idProject,
                        Project.Titel, 
                        Project.idProjecttype, 
                        Project.Begindatum, 
                        Project.Deadline, 
                        Project.idKlant,
                        Projecttypes.idProjecttypes,
                        Projecttypes.Type, 
                        Werknemer.idWerknemer,
                        Werknemer.Voornaam,
                        Statusproject.idStatusProject,
                        Statusproject.Soort,
                        Klant.Naam');
    $this->db->order_by('Titel', 'asc');
    $this->db->from('Project');
    $this->db->join('Klant', 'Klant.idKlant = Project.idKlant');
    $this->db->join('Projecttypes', 'Projecttypes.idProjecttypes = Project.idProjecttype');
    $this->db->join('Werknemer', 'Werknemer.idWerknemer = Project.idWerknemer');
    $this->db->join('Statusproject', 'Statusproject.idStatusProject = Project.idStatusProject');
                if ($idKlant > 0){
    $this->db->where('Klant.idKlant',$idKlant);
    $this->db->where('Project.Begindatum >',$start);
    $this->db->where('Project.Deadline <',$eind);
    }
    $query = $this->db->get();

    if($query->num_rows()>0){
        return $query->result();
    }
    else{
        return false;
    }
}

project.BegindatumProject.Deadlinevarchar(10)。因此,它查看前两个数字而不是完整日期。例如:

$start = '01-04-2014';
'Project.Begindatum' = (Varchar)'02-03-2014'.

然后会显示,因为 它只看'01'(-04-2014) and the '02'(-03-2014)

【问题讨论】:

    标签: mysql sql codeigniter


    【解决方案1】:

    使用mysql的STR_TO_DATE()函数,同时将where()中的第三个参数传递为FALSE

    $this->db->where("STR_TO_DATE(Project.Begindatum,'%d-%m-%Y') >",$start,FALSE);
    $this->db->where("STR_TO_DATE(Project.Deadline,'%d-%m-%Y') <",$eind,FALSE);
    

    最好将列的类型更改为以标准格式存储使用date类型将日期存储在数据库中,使用STR_TO_DATE格式为%d-%m-%Y,那么存储在表中的值应该具有%d-%m-%Y格式,否则它不起作用,它应该与$start = '2014-04-01';进行比较,否则你需要另一个函数,即DATE_FORMAT来格式化它就像01-04-2014一样

    $this->db->where("DATE_FORMAT(STR_TO_DATE(Project.Begindatum,'%d-%m-%Y'),'%d-%m-%Y') >",
    $start,FALSE);
    $this->db->where("DATE_FORMAT(STR_TO_DATE(Project.Deadline,'%d-%m-%Y'),'%d-%m-%Y') <"
    ,$eind,FALSE);
    

    【讨论】:

    • 这与我之前所做的相同,但它仍然不会只查看前两个数字的完整日期。 (当天)
    • 它仍然只查看当天而不是完整日期。
    • @Rene:仅比较日期部分的日期值得怀疑。带有指定日期格式字符串的str_to_date 将字符串转换为完全限定的日期对象。
    • 它只查看月份或年份,当它的日子彼此相等时。但我想比较完整日期。
    • 也许您在比较时没有使用str_to_date 函数。使用 Khalid 的解决方案,您应该会得到结果。
    【解决方案2】:

    提醒:STR_TO_DATE(...) 输出格式:Y-m-d
    示例:2020-12-24

    因此:$start$eind 格式:Y-m-d
    示例:2020-12-31

    $this->db->where("STR_TO_DATE(Project.Begindatum, '%m-%d-%Y') >",$start);
    $this->db->where("STR_TO_DATE(Project.Deadline, '%m-%d-%Y') <",$eind);
    

    我希望这对你也有帮助。和平。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多