将 varchar(7) 列转换为日期时间

Jef*_*son 4 sql sql-server

我有一列中的数据varchar(7),我想将其转换为一DateTime列。

我有一个选择,将其分为月、年并将日期设置为 1。我很难将此数据插入到LogDate [datetime]. 我尝试 CONCAT 选择,但我得到了 Interpretation Syntax 。还有其他方法可以做到这一点吗?

桌子设置

CREATE TABLE LogData
(
    LogMonth [varchar](7) NOT NULL,
    LogDate [datetime] NULL
);

INSERT INTO LogData ([LogMonth])
VALUES ('01/2023');

INSERT INTO LogData ([LogMonth])
VALUES ('02/2023');

INSERT INTO LogData ([LogMonth])
VALUES ('03/2023');
Run Code Online (Sandbox Code Playgroud)

插入

SELECT 
    REVERSE(PARSENAME(REPLACE(REVERSE(LogMonth), '/', '.'), 1)) AS [Month],
    REVERSE(PARSENAME(REPLACE(REVERSE(LogMonth), '/', '.'), 2)) AS [Year],
    [Day] = 1
FROM 
    LogData
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

INSERT INTO LogData (LogDate)
    SELECT 
        CONCAT(REVERSE(PARSENAME(REPLACE(REVERSE(LogMonth), '/', '.'), 1)) AS [Month],
               REVERSE(PARSENAME(REPLACE(REVERSE(LogMonth), '/', '.'), 2)) AS [Year],
               [Day] = 1) 
Run Code Online (Sandbox Code Playgroud)

样本

http://sqlfiddle.com/#!18/16bbc/1

Vvd*_*vdL 6

您实际上需要根据您拥有的信息构建一个日期。一种方法是执行此操作DATEFROMPARTS。它需要年、月和日并将其转换为日期。

SELECT 
  DATEFROMPARTS(RIGHT(LogMonth, 4), LEFT(LogMonth, 2), 1)
FROM LogData
Run Code Online (Sandbox Code Playgroud)

在您的 sqlfiddle 示例中,您必须使用UPDATE代替INSERT,因为您已经创建了一些数据:

UPDATE LogData 
   SET LogDate = DATEFROMPARTS(RIGHT(LogMonth, 4), LEFT(LogMonth, 2), 1);
Run Code Online (Sandbox Code Playgroud)

看看:sqlfiddle