Excel ODBC查询中如何将时间戳与当前日期进行比较?
解决Excel ODBC查询中当前日期比较的问题
首先,你遇到的核心问题是错误地把函数SYSDATETIME()塞进了ODBC时间戳字面量{ts ...}里——{ts}这个语法只能包裹固定的日期字符串,根本不能嵌入动态函数。下面针对你的需求给出具体的解决方案:
1. 用对当前日期函数
不同数据库对当前日期函数的支持略有区别,在ODBC查询里优先选通用标准函数或者目标数据库的内置函数:
- 通用ODBC标准:
CURRENT_TIMESTAMP - SQL Server:
GETDATE()或SYSDATETIME()(直接写就行,别套{ts}) - MySQL:
NOW()
这里我们用CURRENT_TIMESTAMP来保证兼容性。
2. 修正完整查询语句
结合你要筛选「当前日期介于开始/结束日期之间」的需求,同时处理空值、0值对应的特殊日期,修改后的查询如下:
SELECT BOMD.BOMQTY_0, BOMD.UPDDAT_0, BOMD.BOMSTRDAT_0, BOMD.BOMENDDAT_0 FROM myDB.BOMD BOMD WHERE BOMD.UPDDAT_0 > {ts '2018-01-01 00:00:00'} AND ( BOMD.BOMSTRDAT_0 < CURRENT_TIMESTAMP OR BOMD.BOMSTRDAT_0 = {ts '1899-12-31 00:00:00'} -- 对应Excel里值为0的特殊日期 OR BOMD.BOMSTRDAT_0 IS NULL ) AND ( BOMD.BOMENDDAT_0 > CURRENT_TIMESTAMP OR BOMD.BOMENDDAT_0 = {ts '1899-12-31 00:00:00'} OR BOMD.BOMENDDAT_0 IS NULL )
3. 关键细节解释
- 为什么用
1899-12-31代替0?:Excel里值为0对应的00/01/1900是个不存在的日期,多数数据库会把它转换成1899-12-31,用这个标准值做比对更可靠。 - 别再给函数套
{ts}:{ts 'yyyy-mm-dd hh:mm:ss'}是用来表示固定时间戳的语法,只能放静态字符串,动态的当前日期直接调用数据库函数就好。 - 逻辑顺序要清晰:先处理正常的日期比较,再覆盖特殊值和空值的场景,避免逻辑混乱。
额外调试小技巧
如果还是有问题,可以试试这两步:
- 单独测试当前日期函数:比如执行
SELECT CURRENT_TIMESTAMP,看看返回的格式是否和你的日期字段类型匹配。 - 检查字段存储类型:确保
BOMSTRDAT_0和BOMENDDAT_0是datetime/timestamp类型,要是存成字符串的话,得用CONVERT这类函数做格式转换。
内容的提问来源于stack exchange,提问作者R3uK
相关产品推荐
相关产品推荐

