正式问题
1.我正在寻找从varchar
列中获取日期的方法,该列中的值有时被格式化为“YYYYMMDD”,有时被格式化为“YYYYDDMM”。我很清楚20210101是不明确的,但我无法更正数据。因此,只要“MMdd”和“ddMM”都有可能,我就武断地选择“MMdd”而不是“ddMM”。第一种格式在DB中似乎确实更丰富。
1.有人能告诉我当TIMESTAMP_FORMAT
不能将字符串转换为日期时它的行为吗?我期望的是一个NULL值,但似乎不是这样。
更多细节,以及我尝试的
我正在处理一个表,其中日期被编码为整数(2021 - 12 - 31代表'2021-12- 31'),这似乎是一个相当经典的编码。我的问题是,似乎在编码格式上几乎没有一致性:有时月份在中间(20211231),有时月份在末尾(20213112)。
实际上,我在使用squirl编写查询草图时发现了这个事实,并发现TIMESTAMP_FORMAT
有时会返回一个明显的NULL值。
例如:
WITH mydates(d) AS (VALUES 20211231,20213112)
SELECT
DATE(TIMESTAMP_FORMAT(CHAR(d),'YYYYMMDD')) AS dates
FROM mydates
导致
| 日期|
| - -|
| 2021年12月31日|
| |
因此,我想我可以用这样的方法来克服这种情况:
WITH mydates(d) AS (VALUES 20211231,20213112)
SELECT
COALESCE( DATE(TIMESTAMP_FORMAT(CHAR(d),'YYYYMMDD')), DATE(TIMESTAMP_FORMAT(CHAR(d),'YYYYDDMM')), DATE('0001-01-01') ) AS dates
FROM mydates
或
with mydates(d) as (values 20211231,20213112)
SELECT (CASE WHEN d1 IS NULL THEN d2 ELSE d1 END) AS dates FROM (
SELECT
DATE(TIMESTAMP_FORMAT(CHAR(d),'YYYYMMDD')) AS d1 ,
DATE(TIMESTAMP_FORMAT(CHAR(d),'YYYYDDMM')) AS d2
FROM mydates
) tmp_dates
或
WITH mydates(d) AS (VALUES 20211231,20213112)
SELECT
(CASE WHEN DATE(TIMESTAMP_FORMAT(CHAR(d),'YYYYMMDD')) IS NULL THEN DATE(TIMESTAMP_FORMAT(CHAR(d),'YYYYDDMM')) ELSE DATE(TIMESTAMP_FORMAT(CHAR(d),'YYYYMMDD')) END) AS dates
FROM mydates
但所有查询都返回与第一个查询相同的结果,除了最后一个查询无法工作并以错误消息结束。
我猜TIMESTAP_FORMAT
并没有真正返回NULL值,我不知道它在出错时返回什么值,也不知道如何解决这个问题。
3条答案
按热度按时间8e2ybdfx1#
你不能
20210102 - 1月2日还是2月1日?
20210510 - 5月10日还是10月5日?
...
每个月有12天您无法确定日期的格式。这是365天中的144天。
您需要更正数据,使每个日期的格式都相同。
wsxa1bj12#
我设法通过检查两个中心数字来规避这个问题,比如:
虽然这在我的例子中确实有效,但解决方案很难,我仍然不知道假空值会发生什么。
g6ll5ycj3#
STRSQL的行为与JDBC不同:拒绝执行示例查询
无法执行查询。请参阅下层消息。
CPF 426 B函数TIMESTAMP_FORMAT无法运行。
由于原因代码13,函数TIMESTAMP_FORMAT无法运行
13 --指定的格式字串无法解译时间戳记字串。