![](/img/trans.png)
[英]Getting a date for "start of the week", from week and year numbers on 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' )
您有多个问题:
数据类型为“日期”
您正在调用带有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' )
如果这样做,则以下问题无关紧要。
您正在使用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
您正在将MM
格式模型用于MON
格式的数据-这不一定是问题,因为MM
也与MON
和MONTH
匹配,但是您可能应该使用正确的模型。
您的年月日顺序错误。 那些星期是正确的,例如,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.