将varchar(7)列转换为datetime

4

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

我有一个select语句,我将其拆分为月份、年份,并将日期设置为1。但是我在将这些数据插入LogDate [datetime]时遇到了困难。我尝试使用CONCAT进行选择,但出现了语法错误。是否有其他方法可以完成这个任务?

表格设置

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');

插入
SELECT 
    REVERSE(PARSENAME(REPLACE(REVERSE(LogMonth), '/', '.'), 1)) AS [Month],
    REVERSE(PARSENAME(REPLACE(REVERSE(LogMonth), '/', '.'), 2)) AS [Year],
    [Day] = 1
FROM 
    LogData

这是我尝试过的:

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

示例

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


1
日期由年、月和日组成。 '03/2023' 不正确,因为它只有两个部分。03/2023是什么日期?01/03/2023?31/03/2023?15/03/2023 12:00:00?还是其他日期? - Thom A
1
日期由年、月和日组成;'03/2023'不是有效的日期,因为它只有两个部分。那么03/2023是什么日期呢?是01/03/2023吗?还是31/03/2023?或者是15/03/2023 12:00:00?还是其他日期? - Thom A
1
不需要玩弄PARSENAME函数,因为字符串中的yyyy和mm在固定位置上。 - Martin Smith
1
@jefferson,顺便说一句,你做了一个可复现的例子,做得很棒!我们不经常看到这样的例子! - VvdL
1
@jefferson,顺便说一句,你做了一个可复现的例子,干得好!我们很少见到这样的情况! - VvdL
显示剩余5条评论
1个回答

6
你实际上会想要利用你拥有的信息来构建一个日期。一种方法是使用DATEFROMPARTS函数。它接受年份、月份和日期,并将其转换为日期格式。
SELECT 
  DATEFROMPARTS(RIGHT(LogMonth, 4), LEFT(LogMonth, 2), 1)
FROM LogData

在你的 sqlfiddle 示例中,你需要使用 UPDATE 而不是 INSERT,因为你已经创建了一些数据。
UPDATE LogData 
   SET LogDate = DATEFROMPARTS(RIGHT(LogMonth, 4), LEFT(LogMonth, 2), 1);

看一下:sqlfiddle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接