Oracle SQL:从日期提取一年中的一周会产生随机结果

Oracle SQL:从日期提取一年中的一周会产生随机结果,sql,oracle,Sql,Oracle,我一直在使用以下语句从一个日期获取一年中的一周: TO_CHAR(TO_DATE(tbl.col,'YYYY/MM/DD'),'IW') AS week 现在我收到了奇怪的结果,我似乎无法理解这一点。对于以下日期,我将收到第24周: 2017年6月19日17日23日17日24日17日25日17日29日17日30日17日 为此,我收到25份: 2017年6月20日17日21日17日22日17日26日17日27日17日28日17日 ……这种情况还在继续。我现在有点担心,我所有的查询都显示了不正确的

我一直在使用以下语句从一个日期获取一年中的一周:

TO_CHAR(TO_DATE(tbl.col,'YYYY/MM/DD'),'IW') AS week
现在我收到了奇怪的结果,我似乎无法理解这一点。对于以下日期,我将收到第24周:

2017年6月19日17日23日17日24日17日25日17日29日17日30日17日

为此,我收到25份:

2017年6月20日17日21日17日22日17日26日17日27日17日28日17日

……这种情况还在继续。我现在有点担心,我所有的查询都显示了不正确的数据。我现在才注意到这一点的唯一原因是,第26、27、30、31和32周没有结果,而我的其他任何查询都没有结果

对于可能出现的错误,如有任何建议或指示,我们将不胜感激


谢谢大家!

您的年和日顺序错误。这些周是正确的,例如2020年6月17日是第25周,2023年6月17日是第24周,依此类推

尝试:
TO_CHAR(TO_DATE(待定,'DD-MON-YY'),'IW')作为一周

还是什么


您的年和日顺序错误。这些周是正确的,例如2020年6月17日是第25周,2023年6月17日是第24周,依此类推

尝试:
TO_CHAR(TO_DATE(待定,'DD-MON-YY'),'IW')作为一周

还是什么


[TL;DR]只需使用:
TO_CHAR(tbl.col,'IW')

您有多个问题:

  • 数据类型为“日期”

    您正在使用
    日期(而不是
    VARCHAR2
    )调用
    以获取日期(字符串,格式\u模型)
    这会导致Oracle使用
    NLS\u DATE\u FORMAT
    会话参数作为格式模型,将
    DATE
    隐式转换为
    VARCHAR2
    ,这样您就可以将其转换回
    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' )
    
    如果您这样做,那么以下问题就无关紧要了

  • 正如RealCheeseLord指出的,在格式模型中,年和日的位置是相反的;及
  • 您使用的年份格式模型是
    yyy
    ,因此所有年份都将在公元1世纪

    示例

    SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt
    FROM   DUAL
    
    DT
    ----------
    0019-06-17
    
    输出

    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年):

  • 您正在为
    MON
    格式化数据使用
    MM
    格式化模型-这不一定是一个问题,但您可能应该使用正确的模型


  • [TL;DR]只需使用:
    TO_CHAR(tbl.col,'IW')

    您有多个问题:

  • 数据类型为“日期”

    您正在使用
    日期(而不是
    VARCHAR2
    )调用
    以获取日期(字符串,格式\u模型)
    这会导致Oracle使用
    NLS\u DATE\u FORMAT
    会话参数作为格式模型,将
    DATE
    隐式转换为
    VARCHAR2
    ,这样您就可以将其转换回
    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' )
    
    如果您这样做,那么以下问题就无关紧要了

  • 正如RealCheeseLord指出的,在格式模型中,年和日的位置是相反的;及
  • 您使用的年份格式模型是
    yyy
    ,因此所有年份都将在公元1世纪

    示例

    SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt
    FROM   DUAL
    
    DT
    ----------
    0019-06-17
    
    输出

    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年):

  • 您正在为
    MON
    格式化数据使用
    MM
    格式化模型-这不一定是一个问题,但您可能应该使用正确的模型


  • tbl.col的数据类型是什么?数据类型是“日期”,为什么要将日期转换为日期?只需
    TO_CHAR(tbl.col,'IW')AS week
    就可以添加到Serg所说的内容中,永远不要约会已经是日期的东西。如果您这样做,您将强制执行一个隐式转换,如下所示:
    to_date(to_char(您的_date\u col,),“”)
    。在您的例子中,您的nls_date_format参数似乎与您正在放入的格式掩码不同,并且您会得到奇怪的结果。如果要从日期中删除时间元素,请使用
    trunc(您的日期列)
    。谢谢,我相信这可能是原因。看看其他的查询,我不知何故为这个添加了to_date函数。tbl.col的数据类型是什么?数据类型是“date”,为什么要将日期转换为日期?只需
    TO_CHAR(tbl.col,'IW')AS week
    就可以添加到Serg所说的内容中,永远不要约会已经是日期的东西。如果您这样做,您将强制执行一个隐式转换,如下所示:
    to_date(to_char(您的_date\u col,),“”)
    。在您的例子中,您的nls_date_format参数似乎与您正在放入的格式掩码不同,并且您会得到奇怪的结果。如果要从日期中删除时间元素,请使用
    trunc(您的日期列)
    。谢谢,我相信这可能是原因。看看其他的查询,我不知何故为这个添加了to_date函数。我以前没有考虑过这个问题,谢谢!我正在尝试这一点,现在,会让你知道,如果这解决了它我没有考虑过这是一个问题之前,谢谢!我现在正在尝试,如果这能解决问题,我会告诉你的