将 BigInt 时间戳转换为 SQL 中的日期

Convert BigInt timestamp to just Date in SQL

我在转换和类型转换方面遇到了问题。我有一个数据类型为 BigInt 的字段,其值以 "yyyymmddhhmmss" 格式存储,例如“20170609043000”。我正在尝试获取时间戳中日期部分的子字符串,如 20170609,分隔符为 2017-06-09。无法获取时间戳中的日期部分。

我试图获取日期部分的查询:

SELECT CONVERT(date,SUBSTRING(CAST(STR(evt.StartDate,15) as varchar),1, 5), 102) from Event evt

SELECT DATEADD(hour,-5, CONVERT(datetime, SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar),6, 2) + '-' + SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 8, 2) + '-' + SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 1,5) + ' ' + SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar),10, 2) + ':' +SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 12, 2) + ':' + SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 14, 2), 120)) from Event evt

第一个查询 returns 转换后的日期,但月份和日期保持不变,如果我尝试对月份和日期进行子字符串连接,则连接不起作用。

第二个查询根本不起作用。

任何帮助都会很棒。

为什么不只取最左边的 8 个字符并进行转换?

SELECT CONVERT(date, LEFT(20170609043000,8));

理想情况下,您应该使用日期和时间数据类型来存储日期和时间数据。将它们存储在不同的数据类型中只会导致问题,并且永远无法解决无法在其他地方(也就是您的表示层)解决的问题。

您的第二个查询几乎是正确的,但获取年、月、日的顺序错误。试试这个:

SELECT CONVERT(datetime, SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar),2, 4) + '-' + 
                         SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 6, 2) + '-' + 
                         SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 8,2) + ' ' + 
                         SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar),10, 2) + ':' + 
                         SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 12, 2) + ':' + 
                         SUBSTRING(CAST(STR(evt.StartDate, 15) as varchar), 14, 2), 120) 
FROM Event evt

输出:

09/06/2017 04:30:00

Demo on dbfiddle