将 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
我在转换和类型转换方面遇到了问题。我有一个数据类型为 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