繁体   English   中英

Oracle SQL:从日期中提取一年中的星期给出随机结果

[英]Oracle SQL: Extracting the week of the year from date gives random results

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

TO_CHAR(TO_DATE(tbl.col,'YYYY/MM/DD'),'IW') AS week

现在我收到奇怪的结果,我似乎无法弄清楚。 对于以下日期,我将收到第24周的信息:

17年6月19日|| 2015年6月23日|| 2015年6月24日|| 2015年6月25日|| 17年6月29日|| 17年6月30日

为此,我收到25:

17年6月20日|| 17年6月21日|| 17年6月22日|| 2015年6月26日|| 17年6月27日|| 17年6月28日

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

任何建议或指向可能的错误的指针,不胜感激。

谢谢!

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

您有多个问题:

  1. 数据类型为“日期”

    您正在调用带有DATE (不是VARCHAR2 )的TO_DATE( string, format_model ) ,这会导致Oracle使用NLS_DATE_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' ) 

    如果这样做,则以下问题无关紧要。

  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也与MONMONTH匹配,但是您可能应该使用正确的模型。

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

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

或者其他的东西

页面底部的示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM