我有数十万行,其中有四个日期列是这样导入的:

Mon Nov 14 14:52:46 PST 2011
Fri Nov 04 07:50:21 PDT 2011
Thu Dec 01 00:00:00 PST 2011

有三个月:11 月、12 月、1 月。我希望我的新日期格式以这种格式保存到新列中:



我可以通过匹配子字符串月份名称并将其替换为匹配数字的更新语句来执行此操作。所以我可以用这样的方法来做到这一点:
UPDATE tabel
   set col1 = REPLACE(substring(col2, 5,3) 'Nov', 11)

它适用于我运行的第一个月。但是,当我添加 12 月和 1 月时,它仅适用于那些月份,并在我刚刚执行的所有其他行中重置三个字母月份的字符串。

我不知道如何以正确的方式执行此 UPDATE 和 REPLACE 命令,以便它匹配数据库中的所有三个月,然后像我想要的那样将新格式写出到新列。我对 T-SQL 有点陌生,到目前为止,我对那里的文档数量感到不知所措。我已经尝试将所有三个月都放入一系列 UPDATE 语句中,但没有奏效。我认为它需要逐行进行,测试条件,然后在匹配时执行更新。

也许是这样的:
IF @dateColSubString = 'Jan' Then
   UPDATE table
         set newDateCol = REPLACE(substring(col2, 5,3) 'Jan', 01) + '-2012'
   COMMIT
IF @dateColSubString = 'Dec' Then
   UPDATE table
         set newDateCol = REPLACE(substring(col2, 5,3) 'Dec', 12) + '-2011'
   COMMIT

在新列 '01-2011' 中创建这样的值,然后当我对 'Nov' 运行相同的更新请求时,不要将这些值重置为旧值,然后是 'Dec' 以更改这些字符串。

我希望这是有道理的。

最佳答案

试试这个,用你的日期时间做任何你想做的事

DECLARE @t TABLE(str varchar(100))
INSERT @t
VALUES('Mon Nov 14 14:52:46 PST 2011'),('Fri Nov 04 07:50:21 PDT 2011'),('Thu Dec 01 00:00:00 PST 2011')

SELECT
    CAST(DATEPART(MONTH, CAST(SUBSTRING(str, 5, 6) +' '+RIGHT(str, 4) AS DATETIME)) AS VARCHAR) +'-'+ RIGHT(str, 4),
    CAST(SUBSTRING(str, 5, 6) +' '+RIGHT(str, 4) AS DATETIME),
    CONVERT(VARCHAR, CAST(SUBSTRING(str, 5, 6) +' '+RIGHT(str, 4) AS DATETIME), 110)
FROM @t

在您的情况下,假设是这样的 - 您只需选择哪个结果更适合您并采用相应的查询行:
SELECT
    CAST(DATEPART(MONTH, CAST(SUBSTRING(order_send, 5, 6) +' '+RIGHT(order_send, 4) AS DATETIME)) AS VARCHAR) +'-'+ RIGHT(order_send, 4),
    CAST(SUBSTRING(order_send, 5, 6) +' '+RIGHT(order_send, 4) AS DATETIME),
    CONVERT(VARCHAR, CAST(SUBSTRING(order_send, 5, 6) +' '+RIGHT(order_send, 4) AS DATETIME), 110)
FROM YourTableName

关于sql - 通过 IF 语句或 CASE 基于全局子字符串匹配更新表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8816357/

10-14 19:28
查看更多