【问题标题】:Dynamic date in T-SQLT-SQL 中的动态日期
【发布时间】:2018-02-20 15:40:37
【问题描述】:

我正在处理一个问题,我想对日期进行动态过滤(我想根据今天的日期查看过去 6 个月)。 Orderdate 是 INT,这就是我使用 nvarchar 然后日期的原因。当我使用下面的代码时,我收到以下错误消息“从字符串转换日期和/或时间时转换失败。”。有谁知道我能做些什么来解决这个问题?

cast(cast(OrderDate as nvarchar) as date) > dateadd(month,-6, getdate()) 

【问题讨论】:

  • 编辑您的问题并显示OrderDate 的示例。为什么名称中包含“日期”的列会存储为字符串?
  • “订单日期为 INT”。你的问题就在那里。使用Date 指定日期,或使用DateTime2 指定日期和时间。
  • 为什么orderdate是一个int?显然,您存储了一些实际上不是日期的整数值。可能是20180231,也可能是436289。这就是您使用错误数据类型时得到的结果。另外,don't ever specify nvarchar etc. without length.
  • @AaronBertrand Ha,我只是想我应该链接到你的 Bad habits to kick : choosing the wrong data type...
  • 您可能以不正确的方式存储值,它应该是 yearmonthdateint 或者它不应该返回上述错误

标签: sql sql-server date tsql


【解决方案1】:

显而易见的解决方案是使用try_convert()

try_convert(date, try_convert(varchar(255), OrderDate))  > dateadd(month, -6, getdate())

这将消除错误,但可能无法解决根本问题。

您可以通过以下方式找到违规值:

select OrderDate
from t
where OrderDate is not null and
      try_convert(date, try_convert(varchar(255), OrderDate)) is null

【讨论】:

    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 2017-07-11
    • 2018-07-06
    • 2023-03-26
    • 2020-07-23
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    相关资源
    最近更新 更多