繁体   English   中英

如何在 SQL Server 中将 MM/YYYY/DD 格式字符串转换为 DATE?

[英]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')返回1CASTCONVERT函数失败。

这是一种奇怪的格式。 我会推荐datefromparts()

select datefromparts(
    substring(mycol, 4, 4), 
    left(mycol, 2), 
    right(mycol, 2)
) mydate
from mytable

DB Fiddle 上的演示

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_CONVERTTRY_CONVERTTRY_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM