我是 SQL Server 新手,我想知道如何转换 SQL Server 中的数据类型。据我所知 SQL Server 不支持格式掩码(例如“YYYY-MM-DD”或“999”)。它基本上涉及所有数据类型,而不仅仅是如下所示的
DATE
数据类型。
假设我想将“20240512”转换为 2024-12-05,而不是默认值:2024-05-12。
在 Oracle 中,我可以使用 TO_DATE 和 CAST - 这两个函数都支持掩码。
SELECT
TO_DATE('20240512') AS wrong1,
CAST('20240512' AS DATE) AS wrong2,
TO_DATE('20240512', 'YYYYDDMM') AS correct1,
CAST('20240512' AS DATE, 'YYYYDDMM') AS correct2;
在 Postgres 中我可以使用
TO_DATE
。 CAST 不支持格式掩码。
那么,当
TO_DATE
不存在并且 CAST
不支持格式掩码时,SQL Server 会怎样?
总结评论作为答案:
YYYYMMDD
是一种非常具体的格式,用于避免本地化问题。与 ISO8601 形式相同,YYYY-MM-DD
。 - panagiotis-卡纳沃斯
在 TSQL 中,您可以使用 ANSI-SQL 标准
CAST
,或更灵活的 CONVERT
- CAST 和 CONVERT (Transact-SQL)。 CONVERT 在转换为字符串时接受样式参数:SELECT CONVERT(VARCHAR(8), GETDATE(), 112)
。值得指出的是,格式化日期确实会使其成为字符串,因为 DATE
没有格式。 – 帕特里克·赫斯特
看起来OP需要
yyyyddmm
,这不是可用的样式。所以也许可以使用FORMAT
。 – 查理脸
您也无法将
12345678
转换为日期。在您指定要查找数据库来执行 ETL 清理的情况下,这实际上并不是它的工作。如果您确实想将 'YYYYDDMM' 转换为 DATE
,您应该解析输入以便能够以标准顺序提供它,但这是可能的:
SELECT '20233011', TRY_CAST('20230311' AS DATE), CAST(LEFT('20230311',4)+RIGHT('20230311',2)+SUBSTRING('20230311',5,2) AS DATE)
– 帕特里克·赫斯特
Sql Server 不支持格式掩码,但使用
CONVERT
、PARSE
或 FORMAT
函数。但你所要求的转换本质上是......邪恶的。它会让每个开发人员甚至你自己感到困惑。到下个月,如果不是下周一,您将不会记得您使用的是自定义格式,而不是随处可见的标准格式。您将把 20240104 转换为 4 月 1 日。 –
帕纳吉奥蒂斯-卡纳沃斯