在达梦数据库中,NOW() - INTERVAL 1 HOUR 这样的语法确实存在问题,因为 INTERVAL 后面必须跟具体的时间单位(如 '1 HOUR'),而不能直接用整数。这与 PostgreSQL 的语法有所不同,需要特别注意。

正确写法

- ✅ 正确:使用字符串指定间隔值和单位
SELECT NOW() - INTERVAL '1' HOUR;  -- 当前时间减去1小时

-- 等价于
SELECT DATEADD(HOUR, -1, NOW());  -- 使用 DATEADD 函数

常见错误示例

-- ❌ 错误:直接用整数会报错
SELECT NOW() - INTERVAL 1 HOUR;  -- 语法错误

-- ❌ 错误:缺少单引号
SELECT NOW() - INTERVAL 1 'HOUR';  -- 语法错误

其他时间单位示例

-- 减去1天
SELECT NOW() - INTERVAL '1' DAY;

-- 减去30分钟
SELECT NOW() - INTERVAL '30' MINUTE;

-- 减去2周
SELECT NOW() - INTERVAL '2' WEEK;

兼容性说明

  • 达梦 vs Oracle:达梦支持 INTERVAL 语法(Oracle 需用 NUMTODSINTERVAL)。
  • 达梦 vs PostgreSQL:PostgreSQL 允许 INTERVAL 1 HOUR,但达梦必须用 INTERVAL '1' HOUR

替代方案

如果 INTERVAL 语法不适应,可改用 DATEADD 函数(更接近 SQL Server 语法):

-- 减去1小时
SELECT DATEADD(HOUR, -1, NOW());

-- 减去30分钟
SELECT DATEADD(MINUTE, -30, NOW());

性能对比

方法 性能 适用场景
DATEADD 简单时间计算
INTERVAL 变量 需复用 INTERVAL 值

总结

优先使用 DATEADD 函数,代码简洁且性能最优:

-- 直接使用整数变量 @h
SELECT DATEADD(HOUR, -@h, NOW()) FROM your_table;

此方法兼容达梦数据库语法,避免 INTERVAL 拼接的复杂性。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐