【问题标题】:How do you test if something is older than 3 months?您如何测试某物是否超过 3 个月?
【发布时间】:2011-08-03 18:47:38
【问题描述】:

我在选择表中日期为今天之前 3 个月的行时遇到了一些麻烦。我尝试在 where 子句中使用 DATE(NOW() - INTERVAL 3 MONTH),但没有运气。如果项目超过 3 个月,我如何签入 SQL Server?

  UPDATE[TCTdb].[dbo].[Stock]
     SET[Warehouse] = 'old'
   WHERE [ManufacturedDate] <= DATE(NOW() - INTERVAL 3 MONTH)

【问题讨论】:

  • 是实际月份还是 90 天?会是 5/3 或更大吗?
  • 肯定是 3 个月。不是 90 天

标签: sql sql-server tsql


【解决方案1】:

您的语法似乎是错误的。

应该是这样的

UPDATE[TCTdb].[dbo].[Stock]
    SET[Warehouse] = 'old'
WHERE [ManufacturedDate] <= DATEADD(mm, -3, GETDATE())

【讨论】:

  • ++1 这种格式也最适用于您在 ManufacturedDate 字段上可能拥有的任何索引
【解决方案2】:

使用dateadd()

update [TCTdb].[dbo].[Stock]
set [WareHouse] = 'old'
where [ManufacturedDate] < dateadd(month,-3,getdate())

我建议使用dateadd() 而不是datediff(),因为我认为使用datediff()month 日期部分会得到意想不到的结果。

考虑以下语句都返回3

select datediff(month, '1/1/2011','4/1/2011')
select datediff(month, '1/1/2011','4/30/2011')

这两种方法都适用于这种特殊情况......请记住这种行为。

【讨论】:

  • +1 用于链接到 MSDN 上的 DATEADD 文章,这样我就可以找出除“月”之外的其他值对第一个参数有效。
【解决方案3】:

DATEDIFF 函数应该对您有所帮助:

http://msdn.microsoft.com/en-us/library/ms189794.aspx

UPDATE[TCTdb].[dbo].[Stock]
    SET[Warehouse] = 'old'
    WHERE DATEDIFF(month, [ManufacturedDate], GETDATE()) > 3

【讨论】:

  • -1 DATEDIFF 错误。 1 月 1 日到 4 月 30 日相差 3 个月,例如 @marc_s:实际上是错误的
  • 他正在寻找 3 个月,而不是 90 天。 1 月 1 日至 4 月 30 日为 3 个月。你说是几个月?
  • @hspain:使用 -3 个月的 DATEADD 不是 90 天。我减去 3 个日历月。如果我想要 4 月 30 日之前 3 个月的东西,我预计会在 1 月 30 日截止。商业用户也会这样看:
【解决方案4】:

试用 DATEDIFF:

SELECT 
    case 
        when DATEDIFF(month, '2005-12-31' , '2006-04-01 ') > 3
        then 'yes'

        else 'no'

    end

希望对你有帮助,

约翰

【讨论】:

  • DATEDIFF 错误。 1 月 1 日到 4 月 30 日是 3 个月的差异,例如 -1
猜你喜欢
  • 2013-06-22
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多