Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle SQL:Извличането на седмицата от годината от датата дава произволни резултати

[TL;DR] Просто използвайте:TO_CHAR( tbl.col, 'IW' )

Имате множество проблеми:

  1. Извиквате TO_DATE( string, format_model ) с DATE (не е VARCHAR2 ), което кара Oracle да извърши имплицитно преобразуване на DATE към VARCHAR2 използвайки NLS_DATE_FORMAT параметър на сесията като модел на формат само за да можете да го конвертирате обратно в DATE . И така, вие ефективно правите:

    TO_CHAR(
      TO_DATE(
        TO_CHAR(
          tbl.col,
          ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
        ),
        'YYYY/MM/DD'
      ),
      'IW'
    )
    

    Не правете това , просто използвайте:

    TO_CHAR( tbl.col, 'IW' )
    

    Ако го направите, тогава следните проблеми са неуместни.

  2. Както посочва RealCheeseLord, позицията на годината и деня във вашия модел на формат е обърната; и
  3. Вие използвате YYYY за модела на формат на годината, така че всички години ще бъдат през 1-ви век след Христа.

    Пример :

    SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt
    FROM   DUAL
    

    Изход :

    DT
    ----------
    0019-06-17
    

    Ако няма да коригирате имплицитното преобразуване на низове, вероятно ще искате едно от двете:

    TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
    

    или (в зависимост от това дали искате годината 99 да бъде 1999 или 2099):

    TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
    
  4. Вие използвате MM модел на формат за MON форматирани данни - това не е непременно проблем, тъй като MM също съответства на MON и MONTH но вероятно трябва да използвате правилния модел.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Настройка на производителността на SQL за Oracle много ИЛИ срещу IN ()

  2. ORA-28040:Няма съответстващ протокол за удостоверяване

  3. Как да заявя име на база данни в Oracle SQL Developer?

  4. Как да избягам от запазена дума в Oracle?

  5. Мога ли да използвам аналитична функция на Oracle тук?