【问题标题】:How to Format a Date String and Check if Date String is Today and After如何格式化日期字符串并检查日期字符串是今天还是之后
【发布时间】:2019-10-27 02:04:53
【问题描述】:

我当前的表格如下。 名册:ID(int)、RosterDate(varchar)、Worker(varchar)、Dealership(varchar)、Yard(varchar)、Start(varchar)。

我知道我的 RosterDate 列未设置为日期时间,我希望有一个解决方案,我不需要更改数据类型并让 SQL 处理查询/解决方案。

我正在尝试检索今天及以上日期的所有行,并按日期降序排列。 我的日期条目采用以下 DD/MM/YYYY 格式。

我遇到的问题是 SQL 以以下格式 YYYY-MM-DD HH:MM:SS 操作日期格式。

我当前的 SQL 语句。

SELECT * FROM rosters WHERE Worker = 'John Doe' AND FORMAT(RosterDate, 'dd-MM-yyyy') >= CURRENT_DATE() ORDER BY FORMAT(RosterDate, 'dd-MM-yyyy') DESC

这个 SQL 语句有两个问题

FORMAT(RosterDate, 'dd-MM-yyyy') >= CURRENT_DATE()

没有按预期工作。


 FORMAT(RosterDate, 'dd-MM-yyyy') DESC

如果这样做,则仅按 DD 值排序

 SELECT FORMAT(RosterDate, 'dd-MM-yyyy') AS Test ....

返回

 27
 26
 25

代替

 27/10/2019
 26/10/2019
 25/10/2019

为了检索结果,合适的 SQL 查询是什么?我已经浏览了寻找解决方案的文档,但我不断收到日期格式的问题。

这是我使用的大部分代码:

形式:

<?php include '../../dbsession.php'; ?>
<?php
$workers_stmt = $db->prepare("SELECT * FROM workers");
$workers_stmt->execute(); 
$workers_row_count = $workers_stmt->rowCount();

$yards_stmt = $db->prepare("SELECT * FROM yards GROUP BY YardName");
$yards_stmt->execute();
$yards_row_count = $yards_stmt->rowCount();

$rosters_stmt = $db->prepare("SELECT * FROM rosters");
$rosters_stmt->execute();
$rosters_row_count = $rosters_stmt->rowCount();

$datetime = isset($_POST['datetime']) ? date("j/n/Y", strtotime($_POST['datetime'])) : date('j/n/Y', strtotime('now'));
?>
<thead>
<tr>
    <th class="darkest" style="width: 150px;"><?php echo isset($_POST['datetime']) ? date('l', strtotime($_POST['datetime'])) : date('l'); ?>
    <?php echo $datetime; ?></th>
    <?php
    $i = 0;
    $worker = array();
    if($workers_row_count > 0){
        while($row = $workers_stmt->fetch(PDO::FETCH_ASSOC)){
            $worker[$i] = $row['FName'].' '.$row['LName'];
            echo '<th class="text-center darkify" style="width: 100px !important;">'.$row['FName'].' '.$row['LName'].'</th>';
            $i++;
        }
    }
    ?>
</tr>
</thead>
<tbody>
<?php
while($row = $yards_stmt->fetch(PDO::FETCH_ASSOC)){
    $html = '<tr>';
    $html .= '<td class="darkify" style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">
        <b>['.$row['Dealership'].']</b><br/><span class="text-primary">['.$row['YardName'].']</span>
        </td>';
    for($i = 0; $i < count($worker); $i++){
        $variables = "'".$datetime."', '".$row['Dealership']."', '".$row['YardName']."', '".$worker[$i]."'";
        $html .= '<td class="p-0 m-0" id="'.str_replace(" ", "_", '['.$datetime.']['.$row['Dealership'].']['.$row['YardName'].']['.$worker[$i]).']">
        <button class="btn-dark w-100 text-success" style="height: 70px;" onClick="addRoster(event, this.childNodes[1], '.$variables.')">
            <select class="form-control">
                <option value="4AM">4AM</option>
                <option value="5AM">5AM</option>
                <option value="6AM" selected>6AM</option>
                <option value="7AM">7AM</option>
                <option value="8AM">8AM</option>
                <option value="9AM">9AM</option>
                <option value="10AM">10AM</option>
                <option value="11AM">11AM</option>
                <option value="12PM">12PM</option>
                <option value="1PM">1PM</option>
                <option value="2PM">2PM</option>
                <option value="3PM">3PM</option>
                <option value="4PM">4PM</option>
            </select>
        </button>
        </td>';
    }
    $html .= '</tr>';
    echo $html;
}
?>
</tbody>
<script type="text/javascript">
cRB = '<button class="btn-dark w-100 text-danger" style="height: 70px;" onClick="cancelRoster(this)"><b>CANCEL</b></button>';
<?php
$x = 0;
while($rosters_row = $rosters_stmt->fetch(PDO::FETCH_ASSOC)){
    for($i = 0; $i < count($worker); $i++){
        if($rosters_row['Worker'] == $worker[$i]){
            $x++;
            echo 'try{ document.getElementById("'.str_replace(" ", "_", '['.$rosters_row['RosterDate'].']['.$rosters_row['Dealership'].']['.$rosters_row['Yard'].']['.$worker[$i]).']").innerHTML = cRB; } catch { console.log("APPLYING ROSTER '.$x.'...") }';
        }
    }
}
?>  
</script>

Javascript 函数:

function addRoster(event, element, date, dealership, yard, worker){
    if(event.path[0].tagName == "SELECT"){
        //DO NOTHING.
    }else{
        datastring = "";
        for(i = 0; i < element.childNodes.length; i++){
            if(element.childNodes[i].selected){
                datastring += "start=" + element.childNodes[i].value + "&";
            }
        } 
        datastring += "date=" + date + "&";
        datastring += "dealership=" + dealership + "&";
        datastring += "yard=" + yard + "&";
        datastring += "worker=" + worker;
        element.parentNode.parentNode.innerHTML = http("POST", "/admin/formfunctions/add_roster.php", datastring);
    }
}

add_roster.php

<?php
if(isset($_SESSION["admin"]) && $_SESSION["admin"] == true){
    $keyval = "[".$_POST['date']."][".$_POST['dealership']."][".$_POST['yard']."][".$_POST['worker']."]";
    $date = $_POST['date'];
    $dealership = $_POST['dealership'];
    $yard = $_POST['yard'];
    $worker = $_POST['worker'];
    $start = $_POST['start'];

    $add_roster_stmt = $db->prepare("INSERT INTO rosters (KeyVal, RosterDate, Dealership, Yard, Worker, Start) VALUES (:keyval, :date, :dealership, :yard, :worker, :start)");
    $add_roster_stmt->execute(array(
        "keyval" => $keyval,
        "date" => $date,
        "dealership" => $dealership,
        "yard" => $yard,
        "worker" => $worker,
        "start" => $start
    ));

    $html = '<button class="btn-dark w-100 text-danger" style="height: 70px;" onClick="cancelRoster(this)"><b>CANCEL</b></button>';
    echo $html;
}
?>

【问题讨论】:

  • 你的 SQL 数据库是什么?是 SQL Server 吗?
  • 是的,它是一个 SQL 服务器,我正在使用 PDO 和 PHP;如果您愿意,我可以发布代码。
  • 在将这些格式化字符串传递给人类眼球之前,您不应该在立即之前将日期类型转换为格式化字符串。如果您将日期与 dates 进行比较,是不是简单了 100 倍?只需删除所有FORMAT() 调用,您的代码就会运行,并且更快运行。

标签: php sql datetime


【解决方案1】:

基于您使用CURRENT_DATE() 的事实以及您从FORMAT 获得的结果,您似乎实际上在使用MySQL 服务器,在这种情况下您需要使用的函数是STR_TO_DATE:

SELECT * 
FROM rosters
WHERE Worker = 'John Doe'
  AND STR_TO_DATE(RosterDate, '%d/%m/%Y') >= CURRENT_DATE() 
ORDER BY STR_TO_DATE(RosterDate, '%d/%m/%Y') DESC

【讨论】:

  • 实际上,FORMAT 不会放弃,但CURRENT_DATE 可能会。
  • 它看起来正确,但它不起作用。有没有我没看到的问题?
  • 现在我想我应该将数据类型转换为日期。 =|
  • @Rahh 使用DATE 类型作为日期绝对是个好主意。但是STR_TO_DATE 应该可以工作......在什么方面不是?
  • @Rahh 这是一个简单的演示,显示它根据您提供的示例数据类型工作:dbfiddle.uk/…
【解决方案2】:

您应该修复您的数据模型!使用正确的格式存储日期将简化您对数据模型所做的一切。

在 SQL Server 中,FORMAT() 将值转换为字符串。您想将您的值转换为 日期。一种方法使用CONVERT()

SELECT r.*
FROM rosters r
WHERE Worker = 'John Doe' AND
      CONVERT(DATE, RosterDate, 103) >= CONVERT(DATE, GETDATE())
ORDER BY CONVERT(DATE, RosterDate, 103) DESC;

【讨论】:

    猜你喜欢
    • 2020-04-01
    • 2021-07-04
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    相关资源
    最近更新 更多