【问题标题】:Why am i getting the same result for different columns为什么我对不同的列得到相同的结果
【发布时间】:2012-03-15 21:29:27
【问题描述】:

所以我有一个程序,我目前正在调试过程中,我已将其缩小到这个选择语句。

注意:to_date(''), 3300, 5220 表示来自参数的内容。

   SELECT SHIFT_ID_PK, SHIFT_NAME_FK,
         SHIFT_START_DAY, SHIFT_START_TIME,
         SHIFT_END_DAY, SHIFT_END_TIME, 
         SITE_ID_FK, SHIFT_DAY_ID,
         STARTOFFSET, ENDOFFSET,
         TO_TIMESTAMP_TZ((TO_DATE('3/13/2012 7:00 ', 'mm/dd/yyyy HH:MI:SS am') - (3300  / 24 / 60)) + (STARTOFFSET / 24 / 60),  'YYYY-MM-DD HH:MI:SS TZH:TZM') AS SHIFT_START_DATE,  
         TO_TIMESTAMP_tz((TO_DATE('3/14/2012 1:00 ', 'mm/dd/yyyy HH:MI:SS am') - (5220 / 24 / 60)) + (ENDOFFSET   / 24 / 60),  'YYYY-MM-DD HH:MI:SS TZH:TZM') AS SHIFT_END_DATE   
  from   shift_tbl
  WHERE
         ENDOFFSET >= 3300
  AND    STARTOFFSET < 5220 
  order by shift_start_date asc, shift_end_date;

现在假设要做的是,获取时间戳参数并减去偏移值。

该值表示星期天午夜 = 0 时一周内过去的分钟数。(因此,如果是星期一午夜,则偏移量 = 1440)。

当从参数中减去偏移量时,您就得到了一周的开始。然后,您从已经预先确定的表中获取偏移值,并将该值添加到一周的开始以获取时间戳。

这样做是为了获取轮班的开始日期和结束日期。

现在您将在下面看到来自此的结果集示例:

 SHIFT_ID_PK SHIFT_NAME_FK SHIFT_START_DAY SHIFT_START_TIME SHIFT_END_DAY SHIFT_END_TIME SITE_ID_FK SHIFT_DAY_ID STARTOFFSET ENDOFFSET **SHIFT_START_DATE                               SHIFT_END_DATE**   
 6146        6206          3               23:00             4            7:00           2450        3            4260         4740      **11-MAR-13 11.00.00.000000000 PM -05:00        11-MAR-14 07.00.00.000000000 PM -05:00**

现在我的问题是我的 shift_start_date 和 shift_end_date 的值是一样的

 SHIFT_ID_PK SHIFT_NAME_FK SHIFT_START_DAY SHIFT_START_TIME SHIFT_END_DAY SHIFT_END_TIME SITE_ID_FK SHIFT_DAY_ID STARTOFFSET ENDOFFSET **SHIFT_START_DATE                               SHIFT_END_DATE**   
 6146        6206          3               23:00             4            7:00           2450        3            4260         4740      **11-MAR-13 11.56.00.000000000 PM -05:00        11-MAR-13 11.56.00.000000000 PM -05:00**

标记的值
 **.....**

是我所说的价值观。

我已经尝试了几种不同的方法来解决这个问题,但是我所做的一切都没有奏效,所以我想我只是错过了导致这个问题的一些非常简单的东西。

非常感谢任何帮助或建议。谢谢。

【问题讨论】:

  • 除非我遗漏了什么,shift_start_dateshift_end_date 在这两种情况下的值是不同的。所以我不确定我是否理解您认为不正确的内容。
  • 抱歉打错了。我得到的现在正确显示了

标签: sql oracle plsql timestamp


【解决方案1】:

TO_TIMESTAMP_TZ 的第一个参数需要 VARCHAR2;你传递给它一个DATE。因此,在幕后,Oracle 正在对您的 DATE 进行隐式的 TO_CHAR 转换,这会导致您在其中失去精度,以至于两个原本不同的值变得相同。

尝试首先用提供明确格式的TO_CHAR 包围您的DATE,然后将那个 传递给TO_TIMESTAMP_TZ。比如:

SQL> VAR startoffset NUMBER
SQL> VAR endoffset   NUMBER
SQL> EXEC :startoffset := 4260; :endoffset := 4740;

PL/SQL procedure successfully completed.

SQL> SELECT TO_TIMESTAMP_TZ(TO_CHAR((TO_DATE('3/13/2012 7:00 PM'
  2                                  ,       'MM/DD/YYYY HH:MI AM')
  3                               - (3300  / 24 / 60))
  4                               + (:startoffset / 24 / 60)
  5                         ,        'YYYY-MM-DD HH24:MI:SS')
  6         ,               'YYYY-MM-DD HH24:MI:SS TZH:TZM')    AS shift_start_date
  7  ,      TO_TIMESTAMP_TZ(TO_CHAR((TO_DATE('3/14/2012 1:00 AM'
  8                                  ,       'MM/DD/YYYY HH:MI AM')
  9                               - (5220 / 24 / 60))
 10                               + (:endoffset   / 24 / 60)
 11                         ,        'YYYY-MM-DD HH24:MI:SS')
 12         ,               'YYYY-MM-DD HH24:MI:SS TZH:TZM')    AS shift_end_date
 13  FROM DUAL;

SHIFT_START_DATE                                                            SHIFT_END_DATE
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
14-MAR-12 11.00.00.000000000 AM -05:00                                      13-MAR-12 05.00.00.000000000 PM -05:00

SQL>

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    相关资源
    最近更新 更多