【问题标题】:SQL Insert with different sysdate values具有不同 sysdate 值的 SQL 插入
【发布时间】:2013-04-11 07:32:07
【问题描述】:

我正在做这样的插入:

INSERT INTO TABLE 
(
 ID, 
 SOURCE_ID, 
 DATE_FIELD
) 
SELECT 
 ID,
 *,
 SYSDATE
FROM 
(
 AN SQL QUERY
);

当我单独运行 SELECT 部分时,我得到如下值:

1, 1234, 11.04.2013 15:00:00
1, 1235, 11.04.2013 15:00:00
1, 1236, 11.04.2013 15:00:00
1, 1237, 11.04.2013 15:00:00
1, 1238, 11.04.2013 15:00:00

这正是我要插入的内容。

但在运行整个插入后,我得到如下值:

1, 1234, 11.04.2013 15:00:01
1, 1235, 11.04.2013 15:00:02
1, 1236, 11.04.2013 15:00:03
1, 1237, 11.04.2013 15:00:04
1, 1238, 11.04.2013 15:00:05

有人知道为什么 sysdate 会这样吗?有什么好的解决方法?

【问题讨论】:

    标签: sql insert vertica sysdate


    【解决方案1】:

    我不知道为什么 sysdate 会这样,但解决方法是

    DECLARE @now datetime
    SELECT @now = SYSDATE
    
    INSERT INTO TABLE 
    (
     ID, 
     SOURCE_ID, 
     DATE_FIELD
    ) 
    SELECT 
     ID,
     *,
     @now
    FROM 
    (
     AN SQL QUERY
    );
    

    【讨论】:

    • 对不起,忘了说我用的是vertica,他们对变量没有很好的支持
    【解决方案2】:

    至少根据 6.1 文档,每个日期/时间函数应为给定事务提供相同的时间戳。所以如果你得到不同的结果,我会假设从派生表中提取数据是一次发生的。

    尝试将 sysdate 放入派生表中,看看是否能解决您的问题。

    【讨论】:

      【解决方案3】:

      这并不能解释为什么 SYSDATE 不返回您所期望的(实际上,根据文档,它应该是稳定的),但也许您可以使用 NOW() 代替?

      SYSDATE 将始终在一个语句中返回相同的值,NOW() 将始终在事务中返回相同的值。也许在后台 INSERT .. SELECT 被拆分为多个语句(这让我感到惊讶,但这符合您看到的行为)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-11
        • 2015-10-09
        相关资源
        最近更新 更多