SQL Server 如何在SQL中将同一列中的所有项目的字符串转换为日期?

rlcwz9us  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(185)

目前SQL表中有一列包含DMMYYYY的date,列dtype为VARCHAR,但我想将其转换为日期dtype格式,即DD/MM/YYYY
当前格式:

8012005
9012005
10012005

要求格式:

08/01/2005
09/01/2005
10/01/2005

我的尝试

SELECT [serial]
  ,[srn]
  ,[ticker]
  ,[series]
  ,[QT]
  ,[DQ]
  ,[DQ/QT]
  ,[TIMESTAMP]
  FROM [Indexer].[dbo].[EquityNSEDAT]

SELECT CONVERT(TIMESTAMP, '%D/%m/%y');
wz3gfoph

wz3gfoph1#

真实的的问题是这里的表,你需要修改你的设计。要做到这一点,你需要将你的列的数据类型从(大概)基于字符串的数据类型更改为date数据类型。我还假设你有错误的数据,所以将这些错误的数据保留在一个新的列中。你需要在之后检查这些数据并手动修改它。
首先,修改你的设计,这会把你的字符串从一个不明确的值修改为一个ISO格式(yyyyMMdd),然后修改你的列的数据类型:

USE Sandbox;
GO

CREATE TABLE dbo.YourTable (YourDate varchar(8) NULL);

INSERT INTO dbo.YourTable
VALUES ('8012005'),
       ('9012005'),
       ('10012005'),
       ('31112005'),
       ('4132005');
GO

ALTER TABLE dbo.YourTable ADD BadDate varchar(8) NULL;
GO

UPDATE YT
SET BadDate = CASE WHEN TRY_CONVERT(date,FD.FormattedDate) IS NULL THEN YT.YourDate END,
    YourDate = CONVERT(varchar(8),TRY_CONVERT(date,FD.FormattedDate,112),112)
FROM dbo.YourTable YT
     CROSS APPLY (VALUES(RIGHT('00000000' + YT.YourDate,8)))PD(PaddedDate)
     CROSS APPLY (VALUES(CONCAT(RIGHT(PD.PaddedDate,4), SUBSTRING(PD.PaddedDate,3,2),LEFT(PD.PaddedDate,2))))FD(FormattedDate);
GO
ALTER TABLE dbo.YourTable ALTER COLUMN YourDate date NULL;
GO
SELECT *
FROM dbo.YourTable;
GO
--Get bad data
SELECT BadDate
FROM dbo.YourTable
WHERE BadDate IS NOT NULL;

GO
DROP TABLE dbo.YourTable;

完成这些操作后,要获得所需的值 displayed,请在您的表示层(而不是SQL层)中进行配置;在SQL层中将数据类型保留为date

oug3syen

oug3syen2#

要在SQL查询中将DMMYYYY格式的日期(例如“8012005”)转换为DD/MM/YYYY格式(例如“08/01/2005”),请使用CONVERT()函数和相应的样式参数。
在您的情况下,下面的查询会将TIMESTAMP列从DMMYYYY格式转换为DD/MM/YYYY格式:

SELECT [serial]
  ,[srn]
  ,[ticker]
  ,[series]
  ,[QT]
  ,[DQ]
  ,[DQ/QT]
  ,CONVERT(DATE, TIMESTAMP, 105) AS TIMESTAMP
FROM [Indexer].[dbo].[EquityNSEDAT]

相关问题