![](/img/trans.png)
[英]How to convert string in 'DD/MM/YYYY' or 'YYYY-MM-DD' into date in SQL Server?
[英]How to convert MM/YYYY/DD format string to DATE in SQL Server?
我有一列需要将数据转换为 DATE 格式。 每当我遇到数据“MM/YYYY/DD”格式时,我都会收到以下错误,但它适用于其他格式。
从字符串转换日期和/或时间时转换失败
样本数据:
SELECT CAST('05/2020/29' AS DATE);
SELECT ISDATE('05/2020/29')
返回1
但CAST
或CONVERT
函数失败。
这是一种奇怪的格式。 我会推荐datefromparts()
:
select datefromparts(
substring(mycol, 4, 4),
left(mycol, 2),
right(mycol, 2)
) mydate
from mytable
with mytable as (select '05/2020/29' mycol)
select datefromparts(substring(mycol, 4, 4), left(mycol, 2), right(mycol, 2)) mydate
from mytable
| mydate | | :--------- | | 2020-05-29 |
我必须承认,格式MM/yyyy/dd
是一个相当奇怪的日期格式选择。 然而,问题的原因在于您将日期(和时间)数据存储在varchar
。
但是,为此,我可以将数据重新排列为 ISO 格式 ( yyyyMMdd
),然后CONVERT
:
SELECT TRY_CONVERT(date,CONCAT(SUBSTRING(YourString,4,4),LEFT(YourString,2),RIGHT(YourString,2)),112)
FROM dbo.YourTable;
我在这里使用TRY_CONVERT
是因为经验已经无数次证明,那些将日期(和时间)数据作为varchar
在数据库中的数据最终也会得到错误的数据(例如您的风格的'13/2020/11'
)。 这意味着当遇到这些坏行时转换不会失败,而是返回NULL
。
不过,理想情况下,您应该修复列并更改数据类型。 我们实际上可以使用与上述类似的解决方案来做到这一点。 首先通过将列中的值更改为 ISO 格式,但作为varchar
,并测试转换,然后更改数据类型:
UPDATE YT
SET YT.YourString = CONVERT(varchar(8),V.YourDate,112)
FROM dbo.YourTable YT
CROSS APPLY (VALUES(TRY_CONVERT(date,CONCAT(SUBSTRING(YourString,4,4),LEFT(YourString,2),RIGHT(YourString,2)),112)))V(YourDate);
ALTER TABLE dbo.YourTable ALTER COLUMN YourString date NULL;
旁注也是, ISDATE
是一个可怕的函数,就像它的“兄弟” ISNUMERIC
。 这两个函数都返回误报和否定,应该避免。 TRY_CONVERT
, TRY_CONVERT
和TRY_CAST
是更好的选择。
作为一个快速示例,请注意为以下返回的以下值:
SET LANGUAGE ENGLISH; --American, not English...
SELECT ISDATE(20200928); --Returns 1
SELECT ISDATE(17); -Returns 0
SELECT ISDATE('09/2020/28'); --Returns 1
现在,让我们尝试一些转换:
SELECT CONVERT(datetime,20200928); --ISDATE returned 1
将表达式转换为数据类型日期时间时出现算术溢出错误。
SELECT CONVERT(datetime,17); --ISDATE returned 0
成功,返回datetime
1900-01-18T00:00:00.000
。
SELECT CONVERT(datetime2(0),'09/2020/28'); --ISDATE returned 1
从字符串转换日期和/或时间时转换失败。
您可以尝试先指定日期格式:
SET DATEFORMAT MYD;
SELECT CAST('05/2020/29' AS DATE);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.