提问人:bk171 提问时间:8/29/2023 最后编辑:marc_sbk171 更新时间:8/29/2023 访问量:139
在 SQL 中将简单文本列日期转换为日期
Convert a simple text column date to a date in SQL
问:
我需要将这种类型的列转换为日期。列中的数据如下所示:。nvarchar
F2
09222018
我想转换为日期并使其看起来像 .09/22/2018
我试过这个,但语法不正确。
SELECT
f2,
CAST(f2, AS datetime)
FROM
Testbk
我也试过这个:
SELECT
f2,
CONVERT(nvarchar, f2, 101)
FROM
Testbk
再次 - 没有成功的转换。
答:
不完全确定,您想要实现什么:将值转换为日期或以另一种格式将其置换。 请看下文
declare @InF2 varchar(8)='09222018';
select @InF2,LEFT(@iNf2,2)+'/'+SUBSTRING(@InF2,3,2)+'/'+SUBSTRING(@InF2,5,4)AS VARCHAR_USA_DATE,
CONVERT(DATE,LEFT(@iNf2,2)+'/'+SUBSTRING(@InF2,3,2)+'/'+SUBSTRING(@InF2,5,4),101)AS DATE_converted
评论
你可以试试这个:
Select convert(varchar(10),cast(STUFF(STUFF(f2, 3,0,'/'),6,0,'/')as
datetime),101)as f2 from Testbk
请看这里: https://dbfiddle.uk/VUDoJYl8
评论
varchar(50)
要做到这一点,请尝试将转换与输出格式分开 - 即使它们位于一个查询中。我使用了一些与旧SQL兼容的语法,可能是因为没有指定版本。
一个示例:
DECLARE @D NVARCHAR(8) = '09222018';
DECLARE @DT DATETIME;
SELECT SUBSTRING(@D, 5, 4), SUBSTRING(@D, 3, 2),SUBSTRING(@D,1, 2);
SELECT @DT = CAST(CONCAT(SUBSTRING(@D, 5, 4),'-', SUBSTRING(@D, 1, 2) ,'-', SUBSTRING(@D,3, 2)) AS DATETIME);
SELECT FORMAT(@DT,'MM-dd-yyyy');
正如我在评论中提到的,你真正需要做的是修复你的设计。此处显示您的列以 格式表示日期,因此我们需要将您的列更改为数据类型。MMddyyyy
date
为了使您的列成为正确的数据类型,我们需要将其转换为明确的格式,理想情况下。为此,我们需要以明确的格式将其转换为基于字符串的值,然后返回到基于字符串的值。然后我们可以将列转换为正确的数据类型。yyyyMMdd
CONVERT
date
ALTER
不幸的是,没有样式代码,但有 : .将您的值更改为此值并不太困难,只需几秒钟即可。然后我们可以尝试将值转换为 a(如果它不是有效日期,则该值将丢失),然后我们可以将其转换回 .MMddyyyy
MM/dd/yyyy
101
STUFF
TRY_CONVERT
date
CONVERT
varchar
不过,我首先添加一个新列,因为这将存储原始值,您可以检查这些值以尝试恢复任何错误数据。
ALTER TABLE dbo.Testbk ADD StringDate varchar(8); --length assumes all MMddyyyy
UPDATE dbo.Testbk
SET StringDate = f2;
GO
UPDATE dbo.Testbk
SET f2 = CONVERT(varchar(8),CONVERT(date,STUFF(STUFF(f2,5,0,'/'),3,0,'/'),101),112);
ALTER TABLE dbo.Testbk ALTER COLUMN f2 date /*NOT NULL*/;
现在你的设计是固定的,你可以担心值在表示层中的呈现方式,因为你的应用程序将接收日期值的 * binary* 值,并能够按照你喜欢的方式正确设置它的格式。
评论
cast(f2 as datetime)
CONVERT(DATE,CONCAT(RIGHT(f2,4),LEFT(f2,4)),112)