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' )
如果您这样做,那么以下问题就无关紧要了
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' )
如果您这样做,那么以下问题就无关紧要了
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函数。我以前没有考虑过这个问题,谢谢!我正在尝试这一点,现在,会让你知道,如果这解决了它我没有考虑过这是一个问题之前,谢谢!我现在正在尝试,如果这能解决问题,我会告诉你的