根据IF语句将字符串转换为日期时间

时间:2018-11-29 14:54:20

标签: tsql

我正在尝试编写一个SQL查询,以将IT项目更改历史记录从我们的项目管理系统中提取出来。

我正在使用的SQL表有3列有问题的列。都是字符串格式。

**COLUMNNAME**      **PREV_VALUE**      **CURRENT_VALUE**
Userid                NULL                Smith, John
Statusid              Horizon             Open
Projectedend          1541217540000       1542862740000

COLUMNAME字段告诉我特定记录上的哪个字段发生了更改。其他两个字段只是先前值和新值的实际更改。

我需要写一个IF语句,说明IF COLUMNAME = Date Field Change (在上面的示例中为projectend),然后将数字(从技术上来说也是一个字符串)转换为美国日期格式。

在此数据库中使用普通DATE字段时,我将使用以下SQL行更改格式。

DATEADD(second, prjhstdif.PREV_VALUE / 1000, '1970-01-01')

但是因为这些字段是STRING格式,所以在尝试编写SQL查询时遇到错误。 从字符串转换日期和/或时间时转换失败。

我一直在使用的查询:

SELECT 
    prj.[PROJECTID],
    prj.[TITLE],
    prj.[OWNERID],
    prjhst.HISTORYID,
    prjhstdif.COLUMNNAME,
    prjhstdif.PREV_VALUE,

    CASE
        WHEN prjhstdif.COLUMNNAME = 'Projectedend' THEN DATEADD(second, prjhstdif.PREV_VALUE / 1000, '1970-01-01')
        ELSE prjhstdif.PREV_VALUE
    END AS 'Previous Value',

    prjhstdif.COLUMNNAME

  FROM [sdp].[dbo].[ProjectDetails] prj
  LEFT JOIN [sdp].[dbo].[ProjectHistory] prjhst on prj.PROJECTID = prjhst.PROJECTID
  LEFT JOIN [sdp].[dbo].[ProjectHistoryDiff] prjhstdif on prjhst.HISTORYID = prjhstdif.HISTORYID

我还尝试了各种形式的CONVERT和PARSE,包括TRY_变体,但是我遇到了错误或NULL。

您可以通过我的查询提供的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您需要将列prjhstdif.PREV_VALUE强制转换为DATEDIFF内部的BIGINT。查看此查询是否对您有用。

SELECT 
    prj.[PROJECTID],
    prj.[TITLE],
    prj.[OWNERID],
    prjhst.HISTORYID,
    prjhstdif.COLUMNNAME,
    prjhstdif.PREV_VALUE,

    CASE
        WHEN prjhstdif.COLUMNNAME = 'Projectedend' THEN DATEADD(second, CAST(prjhstdif.PREV_VALUE AS BIGINT) / 1000, '1970-01-01')
        ELSE prjhstdif.PREV_VALUE
    END AS 'Previous Value',

    prjhstdif.COLUMNNAME

  FROM [sdp].[dbo].[ProjectDetails] prj
  LEFT JOIN [sdp].[dbo].[ProjectHistory] prjhst on prj.PROJECTID = prjhst.PROJECTID
  LEFT JOIN [sdp].[dbo].[ProjectHistoryDiff] prjhstdif on prjhst.HISTORYID = prjhstdif.HISTORYID