【问题标题】:Combine date and time is very slow, how to make it efficient?合并日期和时间很慢,如何提高效率?
【发布时间】:2020-06-14 03:40:18
【问题描述】:

这是我的代码

concat(CONVERT(varchar(10), cast(cast(cast(DATE1 as int) as char(8)) as date), 101),

上面部分是创建日期格式,然后在下面连接:

', ',
convert(varchar(5), (convert(time, left(RIGHT('000000' + CONVERT(varchar(6), TIME1), 6), 2)
+ ':' + substring(RIGHT('000000' + CONVERT(varchar(6), TIME1), 6), 3, 2)
+ ':' + substring(RIGHT('000000' + CONVERT(varchar(6), TIME1), 6), 5, 2))), 108))

这会返回时间。

将两者组合在同一行输出为 mm/dd/yyy, 13:00

我正在转换原始字段,其中日期写为 yyyymmdd,时间写为 5-6 位数字,71200(7:12,但秒始终为 00)。

这需要很长时间,所以我想要一种方法来提高代码的效率。

注意,我将日期与 4 个不同的时间列连接起来,所以也许这就是它需要很长时间的原因?

【问题讨论】:

  • 进行字符串操作总是很慢。尝试改用 DATEADD。

标签: sql-server datetime time ssms concat


【解决方案1】:

尝试使用 DATEADD 代替字符串操作:

DATEADD(MINUTE, TIME1%10000/100, 
  DATEADD(HOUR,TIME1/10000, 
    CAST(CAST(CAST(DATE1 as int) AS char(8)) AS datetime))

TIME1 / 10000 should give you the number of hours.  71200 -> 7 
TIME1 % 10000 should give you the number of minutes * 100. 71200 -> 1200 
TIME1 % 10000 / 100 will give you the number of minutes.  71200 -> 12

如果您经常查询此数据(比插入/更新它的频率更高),或者您更关心查询性能而不是更新/插入性能,那么您应该考虑在此表上创建一个持久计算列,以便您不必在查询时进行这些计算。然后,您还可以索引该列,如果您定期根据日期时间进行过滤,这将非常有帮助。

【讨论】:

  • 收到此错误:Msg 9810, Level 16, State 1, Line 1 The datepart hour is not supported by date function dateadd for data type date.
  • DATEADD(MINUTE, TIME1%10000/100, DATEADD(HOUR,TIME1/10000, CAST(CAST(CAST(DATE1 as int) AS char(8)) AS date))) 是代码
  • 是的,尝试将原始日期转换为日期时间。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 2019-04-27
  • 2021-03-18
  • 2014-12-04
  • 1970-01-01
相关资源
最近更新 更多