【问题标题】:SQL if statement for date range日期范围的 SQL if 语句
【发布时间】:2021-10-30 19:15:14
【问题描述】:

您好,我需要语法方面的帮助来添加一个条件,如果今天是每月 5 号之后,则检索当前日期,但如果它在 1 号到 5 号之间,那么它应该检索本月之前的月份。请问有什么可以帮忙的吗?以下是我的查询的结构。

 Select * 
 FROM table1  
  left join  table2
       on e.ENTITY_NBR  = d.entity_nbr
     and cast(getdate() as date) between MONTH_BEGIN_DATE and MONTH_END_DATE

【问题讨论】:

  • 你能给我这个查询的实际结果和你需要的输出吗?
  • 您是否只想在返回的列中包含相关日期(今天或今天前一个月,具体取决于您解释的标准),还是您真的想使用计算出的日期以某种方式过滤结果?
  • 您使用的是哪个 dbms?谈到日期/时间,许多产品都有自己的非 ANSI SQL 函数。像 getdate()...
  • MONTH_BEGIN_DATEMONTH_END_DATE 是什么? ed 是什么?这些都没有定义。

标签: sql date if-statement


【解决方案1】:
    Select *,
    CASE WHEN day(GETDATE()) > 5 THEN GETDATE()
    ELSE DATEADD(month,-1,getdate()) END as date
     FROM table1  
      left join  table2
           on e.ENTITY_NBR  = d.entity_nbr
         and cast(getdate() as date) between MONTH_BEGIN_DATE and MONTH_END_DATE

根据您对问题的模糊描述,这是我能写的最好的。

【讨论】:

    【解决方案2】:

    如果您只是想包含今天的日期(如果当前是当月的 5 号或更早,则与上个月的日期相同),那么这可以在您的 SELECT 子句中完成:

    select
        case 
            when datepart(day,getdate()) <= 5 
            then dateadd(month,-1,getdate()) 
            else getdate() 
        end
    

    如果您想实际使用此日期与数据集中的某个字段进行比较,则可以在 WHERE 子句中包含相同的 case 表达式。

    【讨论】:

    • case expressions 放在 WHERE 子句中不是一个好主意。最好使用常规的 AND/OR。
    • 这是一个公平的观点。不完全清楚提问者是否真的想在他们的WHERE 子句中使用这个计算的日期,但你是对的。
    【解决方案3】:

    如果今天在每个月的 5 号之后,但如果它在 1 号到 5 号之间,则检索当前日期,那么它应该检索本月之前的月份。

    根据这个描述,你想要这样的东西:

    select * 
    from table1 e left join
         table2 d
         on e.ENTITY_NBR = d.entity_nbr and
            (day(getdate() > 5 and datediff(month, d.date_col, getdate()) = 0 or
             day(getdate() <= 5 and datediff(month, d.date_col, getdate()) = 1)
            )
    

    【讨论】:

      猜你喜欢
      • 2017-04-28
      • 2020-09-30
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多