【发布时间】:2021-01-29 21:17:02
【问题描述】:
我在 oracle 数据库表中有一个列 Varchar2。在此列中,我存储日期行 29-1-2021 或 28-12-2020。我想在两个日期之间从下面的查询中检索数据,然后我收到 Invalid month 的错误。我该如何解决这个问题?
SELECT Line_Stop_Id, Function_name, Product_family, line_description, Reason_Category, Reason_detail,
Product_item, product_description, request_raised_date, request_raised_time, cm.EMP_NAME as raised_by, Lse.User_Closer_Description,
Cm1.Emp_Name as Closer_User, Lse.User_Closer_Date, Lse.Final_Closer_Description, Lse.Final_Closer_Date, Lse.Final_Closer_Time,
Cm2.Emp_Name as Final_Closer, Lse.Resource_Effected ,
ROUND(24*(sysdate - to_date(Request_Raised_Date
||' '
||request_raised_time, 'DD-Mon-RR HH24:MI:SS'))) AS TAT
FROM Xx_Lsp_Linestoppage_Entry lse
Left join Emp_Master cm ON Lse.Raised_By = Cm.Emp_No
Left join Emp_Master cm1 ON Lse.Closer_User = Cm1.Emp_No
Left join Emp_Master cm2 ON Lse.Final_Closed_By = Cm2.Emp_No
where TO_DATE(Lse.Request_Raised_Date, 'DD-Mon-RR') Between TO_DATE('01-Jan-21', 'DD-Mon-RR') and TO_DATE('29-Jan-21', 'DD-Mon-RR');
【问题讨论】:
-
为什么将日期值存储为 varchar?这是一个非常非常糟糕的主意。每次你这样做,独角兽就会死去。您遇到的问题是该错误决定的直接结果(我敢打赌,有人说“是的,我们可以在以这种可怕的格式存储它们之前验证所有日期。相信我,不会有问题”)
-
从不将日期存储为文本,始终使用正确的日期列。
-
我不明白。您在表
Xx_Lsp_Linestoppage_Entry中写入该列Request_Raised_Date包含一个表示日期的字符串,例如29-1-2021 但在您的 [SQL] 查询条件中,您使用的是不同的格式字符串,即DD-Mon-RR。你熟悉 Oracle 的Datetime Format Models吗? -
也许 edit 您的问题并发布您收到的整个 [Oracle] 错误消息。
-
难以置信,有些人一年仍然使用 2 位数 - 还是我应该说“有些人再次使用 2 位数”?也许Y2K-Bug 是太久以前了,人们已经不知道了。