oracle日期筛选器未显示正确的日期结果

gg0vcinb  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(378)

我有数据

  1. ID MYDATE
  2. 1 2020-02-02 19:45:00:00
  3. 1 2020-02-02 20:00:00:00

我只需要最短日期的数据。
所以我使用query作为(考虑东部和utc时区)

  1. SELECT ID, MYDATE
  2. FROM MYTABLE
  3. WHERE TO_CHAR(FROM_TZ(TO_TIMESTAMP(TO_CHAR(MYDATE.'YYYY-MM-DD HH24.MI.SS'),'YYYY-
  4. MM-DD HH24.MI.SS), 'AMERICA/NEW_YORK) AT TIME ZONE 'UTC', 'YYYYMMDD') =
  5. '20200202'

我得到了2020-02-02的结果(这是预期的)

  1. 1 2020-02-02 19:45:00:00

但当我竞选20200203的时候

  1. 1 2020-02-02 20:00:00:00

我不应该得到的(我不应该得到任何结果)
感谢您的帮助!

bjp0bcyl

bjp0bcyl1#

有两行样本数据。。。给你想要的解决方案带来挑战。但这里有一个查询,它为您提供了id的最低日期行:

  1. WITH tab (id, mydate)
  2. AS
  3. (
  4. SELECT 1, TO_DATE('2020-02-02 19:45:00','YYYY-MM-DD HH24:MI:SS') FROM DUAL union
  5. SELECT 1, TO_DATE('2020-02-02 20:00:00','YYYY-MM-DD HH24:MI:SS') FROM DUAL
  6. ),
  7. ordered_dates AS
  8. (
  9. SELECT
  10. id,
  11. mydate,
  12. ROW_NUMBER() OVER (PARTITION BY id ORDER BY mydate) AS rn FROM tab
  13. )
  14. SELECT id, TO_CHAR(mydate,'YYYY-MM-DD HH24:MI:SS') FROM ordered_dates WHERE rn = 1;
8mmmxcuj

8mmmxcuj2#

美国/纽约时区是utc-4,所以当你把美国/纽约转换成utc时,你得到原来的时间+4小时,即 2020-02-03 01:00:00 UTC :

  1. WITH t (id, mydate)
  2. AS
  3. (
  4. SELECT 1, TO_DATE('2020-02-02 19:45:00','YYYY-MM-DD HH24:MI:SS') FROM DUAL union
  5. SELECT 2, TO_DATE('2020-02-02 20:00:00','YYYY-MM-DD HH24:MI:SS') FROM DUAL
  6. )
  7. select
  8. TO_CHAR(MYDATE,'YYYY-MM-DD HH24.MI.SS') original_time,
  9. FROM_TZ(
  10. TO_TIMESTAMP(
  11. TO_CHAR(MYDATE,'YYYY-MM-DD HH24.MI.SS')
  12. ,'YYYY-MM-DD HH24.MI.SS'
  13. ),
  14. 'AMERICA/NEW_YORK'
  15. )
  16. AT TIME ZONE 'UTC'
  17. as UTC_TIME
  18. from t;
  19. ORIGINAL_TIME UTC_TIME
  20. ------------------- --------------------------------------
  21. 2020-02-02 19.45.00 2020-02-03 00:45:00.000000000 UTC
  22. 2020-02-02 20.00.00 2020-02-03 01:00:00.000000000 UTC
  23. 2 rows selected.

你不需要 to_timestamp(to_char(... 在这种情况下,使用cast更容易:

  1. FROM_TZ(cast(MYDATE as timestamp),'AMERICA/NEW_YORK') AT TIME ZONE 'UTC'
展开查看全部

相关问题