1

我看到了一些关于这个问题的帖子,但我没有让它正常工作。我有一个 PHP 变量,我最初将其作为字符串发布。为了能够处理一周的日期范围,我使用 strToTime 将其转换为日期时间格式(例如,2013 年 7 月 22 日回显为 1374476400)。

我的表格将日期存储为 Ymd 格式的文本(例如,2013 年 7 月 22 日存储为 2013-07-22)。我需要运行一个比较这两个值的查询,以查找属于我一周范围内的日期,因此我试图将该文本转换为日期时间格式以进行比较。

这是我正在使用的 SQL:

$wk_begin = $_POST['wk_begin'];
$wk_begin = strToTime($wk_begin);
$wk_end = $wk_begin + 8;
$sql = "SELECT * FROM myTable WHERE (DATE(date)>=$wk_begin AND DATE(date)<$wk_end)";

我没有收到任何错误,但我的查询没有找到任何记录,即使我知道表中有 7 条匹配记录。所以我有两个问题:

1)有没有更好的方法来解决这个问题?2)如果我在正确的轨道上,我怎样才能让 sql 语句将基于文本的日期转换为一个大整数,以便我可以正确地进行比较。

任何帮助表示赞赏。谢谢!

编辑:感谢所有的建议。我已经更改了表格,以便日期以“日期”格式存储(不再有字符串)。这是更新的代码。仍然没有获得任何价值:

$wk_begin = $_POST['wk_date'];
$wk_end = $wk_begin + 7;
$sql = "SELECT * FROM Workouts WHERE 'date' BETWEEN '$wk_begin' AND '$wk_end'";
4

2 回答 2

3

date是mysql中的保留字,用它作为字段名用反引号括起来。

此外,您的变量插入需要用撇号括起来

SELECT * FROM myTable WHERE (DATE(`date`)>='$wk_begin' AND DATE(`date`)<'$wk_end'

更好的解决方案(除了将日期字段设为date字段之外)是在构建 sql 语句时使用 db 库的转义和引用机制。

此外,由于您以 Ymd 格式存储日期,因此不需要强制转换为日期,因为以这种方式格式化的日期的字符串比较评估与字符串相同。所以

$sql = "SELECT * from myTable WHERE `date` >= ".$db->quoteAndEscape($wk_begin)." and `date` < ".$db->quoteAndEscape($wk_end);

更新

基于日期可用作不带引号的字段名称。

于 2013-07-24T20:28:33.060 回答
0
<?php
$wkbegin = $_POST['wk_begin'];
$wk_begin = strToTime($wkbegin);
$d=date('j', $wk_begin)+8;
$m=date('n', $wk_begin);
$y=date('Y', $wk_begin);
$wk_end = date('Y-m-d', mktime(0,0,0, $m, $d, $y));
$wkbegin = date('Y-m-d', $wk_begin);
$sql = "SELECT * FROM `myTable` WHERE `date`>='".$wkbegin."' AND `date`<'".$wk_end."'";
?>
于 2013-07-24T20:46:38.823 回答