You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中如何将当前日期设置为指定的假设日期(如2021-01-01)?

如何在SQL中替换当前日期为指定值

当然可以实现,根据你使用的数据库类型,有几种实用方法:

方法1:直接替换当前日期函数

这是临时查询场景最直接的方式,把获取当前日期的系统函数直接替换成目标日期字符串:

MySQL/MariaDB

将CURDATE()/NOW()替换为'2021-01-01':

-- 原查询
SELECT * FROM your_table WHERE date_column >= CURDATE();

-- 修改后
SELECT * FROM your_table WHERE date_column >= '2021-01-01';

SQL Server

替换GETDATE()/CURRENT_TIMESTAMP为'2021-01-01':

-- 原查询
SELECT * FROM your_table WHERE date_column >= GETDATE();

-- 修改后
SELECT * FROM your_table WHERE date_column >= '2021-01-01';

PostgreSQL

替换CURRENT_DATE/NOW()为'2021-01-01'::DATE:

-- 原查询
SELECT * FROM your_table WHERE date_column >= CURRENT_DATE;

-- 修改后
SELECT * FROM your_table WHERE date_column >= '2021-01-01'::DATE;

Oracle

替换SYSDATE为TO_DATE('2021-01-01', 'YYYY-MM-DD'):

-- 原查询
SELECT * FROM your_table WHERE date_column >= SYSDATE;

-- 修改后
SELECT * FROM your_table WHERE date_column >= TO_DATE('2021-01-01', 'YYYY-MM-DD');

方法2:定义变量/参数(适合重复使用场景)

如果需要在多个查询中统一使用这个假日期,定义变量可以避免重复修改:

MySQL/MariaDB

SET @fake_current_date = '2021-01-01';
SELECT * FROM your_table WHERE date_column >= @fake_current_date;

SQL Server

DECLARE @fake_current_date DATE = '2021-01-01';
SELECT * FROM your_table WHERE date_column >= @fake_current_date;

PostgreSQL

-- 用CTE定义变量
WITH vars AS (SELECT '2021-01-01'::DATE AS fake_current_date)
SELECT * FROM your_table, vars WHERE date_column >= vars.fake_current_date;

-- 或者会话级自定义参数
SET SESSION myapp.fake_current_date = '2021-01-01';
SELECT * FROM your_table WHERE date_column >= current_setting('myapp.fake_current_date')::DATE;

Oracle

-- 替换变量
DEFINE fake_current_date = '2021-01-01';
SELECT * FROM your_table WHERE date_column >= TO_DATE('&fake_current_date', 'YYYY-MM-DD');

-- PL/SQL变量(适合程序块)
DECLARE
    fake_current_date DATE := TO_DATE('2021-01-01', 'YYYY-MM-DD');
BEGIN
    SELECT * INTO ... FROM your_table WHERE date_column >= fake_current_date;
END;
/

方法3:会话级修改(部分数据库支持,需注意权限)

部分数据库允许临时修改会话的系统日期设置,但这种方式可能影响其他依赖系统日期的操作,需谨慎使用:

MySQL/MariaDB

通过时区偏移模拟目标日期(仅适合临时场景):

-- 计算实际日期到2021-01-01的小时差,设置对应时区
SET time_zone = CONCAT('+', TIMESTAMPDIFF(HOUR, '2021-01-01', NOW()), ':00');
-- 此时CURDATE()会返回2021-01-01
SELECT CURDATE();

Oracle

使用系统包修改会话虚拟时间(需较高权限):

BEGIN
    DBMS_SCHEDULER.SET_ATTRIBUTE('SYS$SESSION', 'TIME_ZONE', 'UTC');
    DBMS_SCHEDULER.SET_ATTRIBUTE('SYS$SESSION', 'START_DATE', TO_TIMESTAMP('2021-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'));
END;
/
-- 此时SYSDATE会返回2021-01-01
SELECT SYSDATE FROM DUAL;

注意:SQL Server和PostgreSQL没有直接修改会话级当前日期的官方方法,优先推荐前两种替换方式。

内容的提问来源于stack exchange,提问作者Woofer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:43:26