SQL查询,检查给定日期是否等于存储的日期,忽略毫秒



我有一个日期列,它以格式

'dd-MON-yy HH.MM:SS.milliseconds AM/PM存储GMT时区的日期,例如03-NOV-22 10.23.31.007000000 AM.

我提供了一个日期,我想写一个查询来检查给定的日期是否等于存储在表中的日期,但我想忽略毫秒。我想确保日期在执行日期比较时处于相同的时区(GMT)。这样做是为了检查日期是否已经存在,并通过忽略毫秒部分来防止重复的日期插入。enter code here如果带有日期的记录不存在,我将使用条件有条件地插入记录

Insert into table_name (col1, col2, col3, col4, col5, col6, col7)
SELECT ?,?,?,?,?,?,? from dual
where 0 = (select count(*) from table_name where strat_time = ?);

可以截断时间戳(小到分钟;秒不会工作,所以-看看这对你是否足够),或者你可以将时间戳转换为日期(它会下降到秒)。

例如:

(设置环境-你不需要这样做)

SQL> alter session set nls_timestamp_format = 'dd.mm.yyyy hh24:mi:ss.ff6';
Session altered.
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:Mi:ss';
Session altered.

比较:

SQL> select systimestamp,
  2         trunc(systimestamp, 'mi') truncated,
  3         cast(systimestamp as date) as_date
  4  from dual;
SYSTIMESTAMP                        TRUNCATED           AS_DATE
----------------------------------- ------------------- -------------------
06-NOV-22 07.28.52.110000 PM +01:00 06.11.2022 19:28:00 06.11.2022 19:28:52
SQL>

在您的情况下,您可以例如:

insert into table_name ...
select ...
from dual
where not exists (select null 
                  from table_name
                  where cast(start_timestamp as date) = cast(:timestamp_value, as date)
                 );

使用MERGE语句并在1秒范围内匹配:

MERGE INTO table_name dst
USING (SELECT ? AS dt FROM DUAL) src
ON src.dt <= dst.start_time AND dst.start_time < src.dt + INTERVAL '1' SECOND
WHEN NOT MATCHED THEN
  INSERT (col1, col2, col3, col4, col5, col6, col7)
  VALUES (?,    ?,    ?,    ?,    ?,    ?,    ?);

最新更新