我正在尝试编写一个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。
您可以通过我的查询提供的任何帮助将不胜感激。
答案 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