如果当前日期在 SQL 中为 1 月,如何检索去年的 12 月 [重复]

How to retrieve December of last year if current date is January in SQL [duplicate]

提问人:Krittapat Somsiri 提问时间:11/17/2023 最后编辑:T NKrittapat Somsiri 更新时间:11/20/2023 访问量:81

问:

如果当前日期是 2024 年 1 月,我想查询 上个月是 2023 年 12 月。我不确定如何调整查询 在 where 语句中。

有人可以为我提供帮助吗? 谢谢你的优势。

where year(cm.ENTRY_DATE) = YEAR(GETDATE())
and month(cm.ENTRY_DATE) = MONTH(DATEADD(month, -1, GETDATE()))

这是完整的查询:

    Select
      distinct 
      a.POLICY_NO,
      c.CLAIM_NO,
      c.ENTRY_DATE,
      c.LOSS_DATE,
      c.LOSS_TIME,
      c.LOSS_DESC_CODE,
      c.LOSS_DESCRIPTION,
      c.CLAIM_STATUS,
      c.CLAIM_TYPE,
      c.PERSON_ENTRY_CODE,
      (
        select
          p.person_full_name
        from
          center_setup.dbo.setup_person_name_master p
        where
          p.person_short_name = c.person_entry_code
      ) as Person_Name,
      c.loss_place_name
    from
      (
        select
          cm.policy_no,
          COUNT(cm1.claim_no) as Count_,
          cm.LOSS_DATE,
          cm.ENTRY_DATE,
          cm.LOSS_DESC_CODE
        from
          cosl_master cm
          inner join cosl_master cm1 on cm.POLICY_NO = cm1.POLICY_NO
          and cm.loss_date = cm1.loss_date
          and cm.loss_desc_code = cm1.LOSS_DESC_CODE
          and cm1.CLAIM_STATUS <> 'I'
        where year(cm.ENTRY_DATE) = YEAR(GETDATE())
          and month(cm.ENTRY_DATE) = MONTH(DATEADD(month, -1, GETDATE()))
          and cm.claim_status in ('O', 'R')
          and cm.CLAIM_STATUS <> 'I'
        group by
          cm.claim_no,
          cm.policy_no,
          cm.LOSS_DATE,
          cm.ENTRY_DATE,
          cm.LOSS_DESC_CODE
        having
          COUNT(cm1.claim_no) > 1
      ) A
      left join COSL_MASTER c on A.POLICY_NO = c.POLICY_NO
      and c.CLAIM_STATUS <> 'I'
      and a.LOSS_DATE = c.LOSS_DATE
      and c.LOSS_DESC_CODE = a.LOSS_DESC_CODE
    order by
      a.policy_no asc
sql sql-server sql-date-函数

评论

0赞 Xedni 11/17/2023
请提供示例数据、完整查询和预期结果。从你的问题的结构中并不清楚你在追求什么。
1赞 Schwern 11/17/2023
你只想要上个月吗?如果是 2024 年 2 月,您想要 2023 年 1 月?
2赞 Galaxiom 11/17/2023
不要使用该查询条件。它不能SARGable,因为它只能在应用函数后选择每条记录,这意味着它不能使用索引。您应该计算要筛选的时间段的第一天和最后日期,并直接对ENTRY_DATE使用 BETWEEN(应将其编入索引)。当记录数量较小时,您不会注意到性能差异,但查询最终会变慢到爬网速度。
1赞 Error_2646 11/17/2023
这读起来就像是这个问题的副本,有一个非常全面、最新的答案。有一些问题需要担心。stackoverflow.com/questions/1424999/......
1赞 T N 11/17/2023
谨慎关于上述链接的问题:虽然第一个答案很好,但其他几个答案的边缘条件不正确,或者涉及 和 函数的低效使用。“你应该做什么”后面的代码就是你想要的。如注释中建议的那样,也可以设置为变量。然后,更新的条件将是 。(请注意,由于结束日期是排他性的,因此使用结束日期代替 . 或 .)YEAR()MONTH()@startOfLastMonth= DATEADD(month, -1, @startOfCurrentMonth)cm.ENTRY_DATE >= @startOfLastMonth AND cm.ENTRY_DATE < @startOfCurrentMonth<<=BETWEEN

答:

1赞 tinazmu 11/17/2023 #1

如果您想要“上个月”:

WHERE cm.ENTRY_DATE between 
  DATEADD(DAY, 1, EOMONTH(GETDATE(), -2))
  AND
  EOMONTH(GETDATE(), -1)

如果您想要“上一年”的 12 月:

WHERE cm.ENTRY_DATE between 
   DATEFROMPARTS(YEAR(GETDATE())-1, 12, 1)
   AND
   DATEFROMPARTS(YEAR(GETDATE())-1, 12, 31)

EOMONTH:返回给定日期(在本例中为日期时间,因此它也方便地删除了 GETDATE() 的时间部分)的最后一天。

DATEFORMPARTS 从给定的年、月、日部分“构建”日期值;如果你对 12 月的月份感兴趣,月份和日期是常数,那么年份只是从当前年份 --1 中取出。