sql删除字符串的一部分以格式化日期

时间:2013-02-07 16:47:35

标签: php sql sql-server regex tsql

我从工作中的某个人那里继承了一个数据库,并且他们已经将所有日期存储在VARCHAR()中。通常我会将其转换为日期时间并继续前进。但它以“2012年6月19日星期二上午11:46:40”的格式存储。我正在使用PHP和SQL中的一些脚本和日期比较,我需要将其作为可用日期。

我尝试用这种方式进行转换:通过获取旧日期并将其转换为单独的字段,我将在转换时重命名。当我运行它时,我收到错误

 UPDATE ticket_backup
    SET new_date = CONVERT(VARCHAR(50), CAST(submit_date AS DATETIME), 109)
  

从binary / varbinary转换datetime时转换失败   字符串。

所以现在我想我需要使用正则表达式删除子字符串以删除我不需要的东西。我需要得到它的格式为SQL Server DATETIME标准的“2013-02-07 11:28:51”

任何帮助都会非常感激,因为我遇到了障碍,我需要转换很多记录。

3 个答案:

答案 0 :(得分:2)

不完整,但这就是我接近它的方式:

  1. 创建新的日期列
  2. 更新所有当前值以摆脱日期部分...

    更新mytable set mydate = replace(mydate,' Monday,','');

    更新mytable set mydate = replace(mydate,' Tuesday,','');

    1. 删除' at'字

      更新mytable set mydate = replace(mydate,' at','');

    2. 再次尝试转换

      更新ticket_backup     SET new_date = CONVERT(VARCHAR(50),CAST(submit_date AS DATETIME),109)

    3. 删除旧栏目

    4. 重命名新列

答案 1 :(得分:1)

SQL约会..总是很有趣!试试这个,只要所有行都具有与你的演示行相同的格式(例如一天后的逗号),就应该工作:

UPDATE ticket_backup
    SET new_date = CAST(REPLACE(SUBSTRING(CAST(submit_date as varchar(50)) ,
            PATINDEX('%,%',CAST(submit_date as varchar(50)) )+2 ,LEN(CAST(submit_date as varchar(50)) )),'at ', '') as datetime)

答案 2 :(得分:1)

这是一种可行的方式,就像我认为的那样简单:

SELECT CONVERT(DATETIME,REPLACE(RIGHT(submit_date,LEN(submit_date)-CHARINDEX(',',submit_date)),' at ',' '),109)

SQL Fiddle