【问题标题】:Compare some date predicate based on 1st of the month根据当月 1 日比较某些日期谓词
【发布时间】:2018-02-26 11:01:51
【问题描述】:

我想从 getdate() 获取标题 (yyyy-mm) 中的日期格式,以便在 where 子句中使用它从我格式化的日期中获取 日期。到目前为止,我发现几乎所有人使用 convert(varchar(10),getdate(),120) 但那是 varchar 不能用 检查吗?那么有人可以帮助我以 yyyy-mm 格式制作日期还是不可能的?

【问题讨论】:

  • 如果您有一个现有的日期时间,您应该将它与另一个日期时间进行比较,例如使用 between。为什么要进行字符串比较?
  • 您如何比较 YYYY-MM 与日期时间字段??
  • @AlexK。是的,我让它变得更复杂,然后我应该,tnx一切都有帮助:P
  • @YogeshSharma 我想如果它是 Date 的形式我应该可以,但现在我认为没有必要我可以更简单地做到这一点
  • 也许应该重写问题以表达愿望,不是与“YYYY-MM”字符串进行比较,而是根据月份的1日比较某个日期谓词。跨度>

标签: date tsql datepart


【解决方案1】:

为什么不能使用 > 和 和

但是,您通常不希望在数据库中执行此操作。谓词如:

WHERE CONVERT(VARCHAR(10), [DateColumn], 120) >= '2018-02-26'

被认为是“非 SARGable”,不能使用索引。这意味着服务器将在比较之前对基础列应用暴力转换,从而产生索引扫描或表扫描,具体取决于您的架构。

对于绝大多数情况,您希望将列用作操作数,而无需事先进行任何类型的转换。因此,谓词应表示为:

WHERE [DateColumn] >= '2018-02-26'

这将导致将“2018-02-26”操作数隐式转换为 Date 或 DateTime(无论列类型是什么),并且可以使用索引。

绝对最好的是这样的显式转换:

WHERE [DateColumn] >= CAST('2018-02-26' AS DATETIME)

这样,就没有错误、隐式转换或非 SARGable 谓词的余地。

【讨论】:

  • 你能帮我从这个转换中得到 -7 个月吗 CONVERT(varchar(7),GETDATE(),120) ?那天我做了 CONVERT(varchar(7),GETDATE()-7,120) 我应该做 -90 还是有更准确的方法?
  • 在 T-SQL 中获取“每月第一天”的标准方法是:DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0)。因此,在此之前的 7 个月将是用作 DATEADD 参数的相同表达式,但使用 MONTH 除外。因此,从当月的第一天开始的 7 个月是 DATEADD(month, -7, DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0))。将其简化为 DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP) -7, 0)
  • 问题是我需要过去 7 天/7 个月/7 年的数据,所以我有点困惑,不知道从哪里开始,该怎么做,这很复杂,但我必须这样做:P,首先我想我需要限制从和到的日期,所以我在你的帮助下做这件事 tnx:D
  • @АлексаЈевтић 是的,只需根据需要定义您的日期范围。请记住,您讨论的每个范围都以日期开头,例如“2017-01-01”,并且出于任何原因都不需要缩减为 VARCHAR,例如“2017-01”。您可以使用 DATEADD() 和 DATEDIFF() 来完成它。
【解决方案2】:

简单地说,你不想按照你要求的方式做这件事。

要查找与特定年份和月份匹配的记录,只需按以下方式使用两个where 条件:

declare @SomeDate date = '20180114';    -- This is any date.
-- This gets the first day of the month of the date above.
declare @MonthStart date = dateadd(month,datediff(month,0,@SomeDate),0);
-- This gets the first day of the following month of the date above.
declare @NextMonthStart date = dateadd(month,datediff(month,0,@SomeDate)+1,0);

select cols
from tables
where DateCol >= @MonthStart
  and DateCol < @NextMonthStart;

【讨论】:

  • 不需要select初始值。并且declare @NextMonthStart date = dateadd( month, 1, @MonthStart ); 既简单又清晰(恕我直言)。
  • @HABO 你是对的!已更新。
【解决方案3】:

如果您有一个现有的日期时间,您应该将它与另一个时间进行比较,例如使用 between。为什么要做字符串比较

【讨论】:

    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多