【问题标题】:Convert nvarchar date to datetime将 nvarchar 日期转换为日期时间
【发布时间】:2015-05-21 12:25:03
【问题描述】:

我将日期作为 nvarchar 存储在 sql server 数据库中,但我需要创建一个报告并根据日期从最后一天提取数据。

我在数据类型是 DateTime 时使用这个:

SELECT *
FROM [table]
WHERE timein >= DateAdd(hh, -24, GETDATE())

我想我需要将GETDATE() -24 转换为字符串以将其与数据库进行比较 格式需要是这样的:

April-30-15

谁能帮我创建一个查询,使用这种日期格式选择过去 24 小时的记录?

【问题讨论】:

  • (1) 编辑您的问题并提供示例数据和所需结果。 (2) 修复你的数据库,以原生格式而不是字符串来存储日期/时间值。
  • 如果不破坏我们在工厂中使用的程序,我无法更改数据库。我可以在未来修复程序和日期,但转换将是未来重大升级的一部分。
  • 如果这是您必须使用的格式,您当然不想强制比较以字符串形式进行。还是您喜欢 4 月的日期早于 1 月的日期?
  • 显示您的表定义和一些示例数据。我认为你把问题复杂化了。

标签: sql sql-server tsql datetime


【解决方案1】:

将您的 timeIn 字符串转换为日期并使用日期而不是字符串进行比较。如果您用空格替换连字符,它将能够转换为日期。我假设您需要从前一天开始的值(忽略当前时间),所以我也将其转换为日期。

SELECT *
FROM [table]
WHERE cast(replace(timein, '-', ' ') as date) >= cast(DateAdd(dd, -1, GETDATE()) as date)

【讨论】:

  • 是的,但是如果您有大量数据,它会很慢,因为无法创建索引来满足查询 - 所以它总是会扫描整个表。它是non-sargable
  • 同意,正如 matt 所说,将函数放在 where 子句中的列名上会导致扫描。最好将 getdate 重写为列的格式。
  • @Greg 唯一的问题是他的日期格式不支持>= 比较。因此,理想情况下,您将修复表格以使用日期列。在紧要关头,您可以使用我的答案。
  • 你是对的,没有意识到它是 nvarchar col。
猜你喜欢
  • 1970-01-01
  • 2015-09-23
  • 2021-01-17
  • 2014-11-19
  • 2021-11-12
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多