日期列是varchar如何选择从2019年1月1日到今天的数据

时间:2019-07-18 10:41:30

标签: php mysql sql

我在获取数据时遇到问题。日期保存在VARCHAR中,这意味着它将字符串化。我想在表中选择从01-01-2019到今天的数据。所以我在哪里上课有问题。

请在下面的代码中尝试获取数据,但仍无法正常工作。我正在使用STR_TO_DATE(holiday_date, '%d-%m-%Y')来将格式字符串更改为日期列。

<?php 
echo  $edate=date('d-m-Y');
$query="SELECT * FROM holidays where STR_TO_DATE(holiday_date, '%d-%m-%Y')='$edate' ORDER BY STR_TO_DATE(holiday_date, '%d-%m-%Y') asc ";
$stmt=$conn->prepare($query);
$stmt->execute();
$i=1;
    while ($result = $stmt->fetch()) {
    ?>
<tr class="holiday-completed">
    <td><?php echo $i;?></td>
    <td style="display: none;"><?php echo $result['id'];?></td>
    <td><?php echo $result['title'];?></td>
    <td><?php echo $result['holiday_date'];?></td>
    <td>
        <?php $s=$result['holiday_date'];
                $sdate = strtotime($s);
                echo date('l',$sdate);
        ?>
    </td>

2 个答案:

答案 0 :(得分:3)

这样的查询,然后:

SELECT * 
FROM holidays 
WHERE STR_TO_DATE(holiday_date, '%d-%m-%Y') BETWEEN STR_TO_DATE('01-01-2019', '%d-%m-%Y') AND NOW()
ORDER BY STR_TO_DATE(holiday_date, '%d-%m-%Y') asc

但实际上,您应该整理数据;

  • 创建一个新的日期类型列,
  • 运行诸如UPDATE table SET holiday_date_PROPER = STR_TO_DATE(holiday_date, '%d-%m-%Y')之类的查询以进行预填充
  • 创建触发器以将字符串一次转换为日期(在插入或更新时),以便将来也可以处理插入和更新,
  • 查询日期列而不是varchar列(节省了数百次每次运行选择查询所必需的转换-在应用程序的生命周期内,它将节省数百万次转换),
  • 将您的应用切换为使用日期列,
  • 删除varchar列

答案 1 :(得分:0)

您可以将以下SQL与BETWEEN条件一起使用。使用CURRENT_DATE()获取今天的日期。

$sql = "SELECT 
    *
FROM
    holidays
WHERE
    holiday_date BETWEEN STR_TO_DATE('$edate', '%Y-%m-%d') AND CURRENT_DATE()
ORDER BY STR_TO_DATE(holiday_date, '%Y-%m-%d') ASC";