无法从MS SQL Server的datetime列按当前时间过滤获取数据,求排查
问题分析与解决方案
你的问题主要出在日期格式不兼容和SQL语法/安全问题上,具体拆解如下:
1. 日期格式不匹配
MS SQL Server的datetime类型默认不识别d.m.Y H:i(比如30.05.2020 14:10)这种格式,它更适配YYYY-MM-DD HH:MI:SS或符合数据库区域设置的格式。直接用你生成的格式拼接SQL,数据库无法正确解析时间值,自然找不到匹配的数据。
2. SQL语法错误(未用引号包裹日期值)
即使格式正确,datetime类型的值在SQL语句中必须用单引号包裹,你的代码里GPS_datetime=$datetimenow缺少引号,这会导致SQL解析异常,虽然sqlsrv_query没有返回false,但实际执行的查询是无效的。
3. 潜在SQL注入风险
直接将变量拼接进SQL语句是非常不安全的做法,不仅容易引发注入攻击,还会导致各种语法问题。
正确解决方案:使用参数化查询
参数化查询既能避免SQL注入,还能让sqlsrv驱动自动处理数据类型转换,不用手动纠结日期格式。这里提供两种靠谱的实现方式:
方式一:用SQL Server自带的当前时间函数
如果你的需求是获取数据库服务器当前时间对应的数据,直接用GETDATE()函数即可,无需在PHP中生成时间:
<?php $serverName = ''; $cinfo = array( "Database" => "", "UID" => "", "PWD" => "" ); $conn = sqlsrv_connect($serverName, $cinfo); if ($conn) { echo "connected" . "<br/>"; // 使用GETDATE()获取数据库当前时间,避免手动拼接时间 $sql = "SELECT * FROM dbo.GorElectroTrans WHERE GPS_datetime = GETDATE()"; $result = sqlsrv_query($conn, $sql); if ($result !== false) { while ($obj = sqlsrv_fetch_object($result)) { echo $obj->Longitude . '<br />'; } } else { // 打印查询错误信息 die(print_r(sqlsrv_errors(), true)); } } else { die(print_r(sqlsrv_errors(), true)); } ?>
方式二:传递PHP生成的时间作为参数
如果需要用PHP服务器的当前时间(比如WordPress的current_time),可以把时间转成SQL Server兼容的格式,再通过参数绑定传递:
<?php $serverName = ''; $cinfo = array( "Database" => "", "UID" => "", "PWD" => "" ); $conn = sqlsrv_connect($serverName, $cinfo); if ($conn) { echo "connected" . "<br/>"; // 用mysql格式生成时间,刚好适配SQL Server的datetime类型 $datetimenow = current_time("mysql"); echo $datetimenow . "<br/>"; // 参数化查询,用?作为占位符 $sql = "SELECT * FROM dbo.GorElectroTrans WHERE GPS_datetime = ?"; $params = array($datetimenow); $result = sqlsrv_query($conn, $sql, $params); if ($result !== false) { while ($obj = sqlsrv_fetch_object($result)) { echo $obj->Longitude . '<br />'; } } else { die(print_r(sqlsrv_errors(), true)); } } else { die(print_r(sqlsrv_errors(), true)); } ?>
补充:时间精度问题
如果GPS_datetime字段包含秒级/毫秒级精度,直接用=匹配可能因为时间完全一致才会返回结果,实际场景中你可能需要用范围查询,比如获取当前时间前后5分钟的数据:
SELECT * FROM dbo.GorElectroTrans WHERE GPS_datetime BETWEEN DATEADD(MINUTE, -5, GETDATE()) AND GETDATE()
内容的提问来源于stack exchange,提问作者Eugene Chefranov
相关产品推荐
相关产品推荐

