【问题标题】:How to correct this delete query如何更正此删除查询
【发布时间】:2019-11-18 21:56:01
【问题描述】:

我需要做一个这样的选择查询:

select *
from faults
where insertdate < DATEADD(DAY, -30, sessiondate)

查询应该是正确的,但我得到这个错误:

从字符串转换日期和/或时间时转换失败。

因为,sessiondate 包含一个日期,但作为字符串而不是日期格式。

有没有办法用字符串而不是日期类型来做这个查询?

【问题讨论】:

  • 插入日期或会话日期在一条或多条记录中无效。
  • 我将 select 而不是 delete 用于测试,但目的是相同的,从某个日期获取所有数据并将该日期减去 30 天
  • 您必须将 sessiondate 列类型转换为日期数据类型,否则您的查询将无法正常工作

标签: sql sql-server string date


【解决方案1】:

错误似乎很明显。 insertdate 和/或 sessiondate 存储为字符串。你应该修复数据。

SQL Server 有三种方法可以转换这些值:

  • 通过将字符串放置在预期日期/时间的位置来隐式处理。
  • 显式使用CAST()/CONVERT()
  • 明确而灵活地使用PARSE()

你需要弄清楚你的格式是什么。他们可以转换它。您没有提供任何信息,但典型的方法是:

where insertdate < DATEADD(DAY, -30, TRY_CONVERT(date, sessiondate, <date style here>))

通常CONVERT() 提供的格式就足够了(请参阅here)。有时,您可能需要使用TRY_PARSE()

编辑:

要支持时间戳,则需要转换为datetime2

try_convert(datetime2, '2019-07-08T09:17:19+02:00')

您应该与带有时间戳的值进行比较。

【讨论】:

  • 如果日期是这样的 2019-07-08T09:17:19+02:00 我应该放什么样的数据样式?另外我还有其他额外的日期 2019-07-08T09:17:19Z 像这个在桌子里面
  • @fusolage 你应该怎么做?重来。更改您的架构以使用正确的数据类型,然后更改您的应用程序以正确填充它们。完成后,您将永远不会再遇到此问题。仔细考虑是否需要存储与不同时区相对应的值 - 如果是这样,则应考虑将所有时间存储为 UTC。
猜你喜欢
  • 1970-01-01
  • 2011-02-03
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
相关资源
最近更新 更多