SQL Server DATEDIFF应返回1,表示合同的第一个月

wz3gfoph  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(106)

假设我有一个日期,我有下面的,顺便说一下,是SQL内置函数,我刚刚在我的数据中展示了它可能是什么。

select * from contract c
  inner join payment p 
  on c.contract = p.contract
  where DATEDIFF(MONTH, c.startDate, getdate())
  <> 1

上面的工作很好,如果月份不一样,所以我做了什么,有点修复这是这个。

select * from contract c
   inner join payment on p.contract= c.contract
   where DATEDIFF(MONTH, c.startDate, getdate())
   <> 1
   and (DATEDIFF(MONTH, c.startDate, getdate())
   <> 0 and DATEDIFF(year, c.startDate, 
   getdate() <> 0)

但是如果你注意到,我把年份和月份的检查放在括号里,但是这样做行吗?所以我想在年份和月份都是0的时候,只考虑和。
所以如果我有
| 日期|获取日期|月数|应该是|
| - -|- -|- -|- -|
| 2022年5月11日|2022年5月11日|第0页|一个|
| 2022年5月12日|2022年5月11日|一个|一个|
| 2022年5月13日|2022年5月11日|2个|2个|
| 2023年5月11日|2022年5月11日|十二|十二|

bbmckpt7

bbmckpt71#

只需更改条件,排除0和1以及负值:

SELECT *
FROM
    contract c
    INNER JOIN payment p
        ON c.contract = p.contract
WHERE DATEDIFF(MONTH, c.startDate, GETDATE()) > 1

如果还需要考虑负值,可以编写

SELECT *
FROM
    contract c
    INNER JOIN payment p
        ON c.contract = p.contract
WHERE NOT DATEDIFF(MONTH, c.startDate, GETDATE()) BETWEEN - 1 AND 1

...
WHERE ABS(DATEDIFF(MONTH, c.startDate, GETDATE())) > 1

如果要按指定的月数返回差额,可以编写

SELECT 
    CASE WHEN DATEDIFF(MONTH, c.startDate, getdate()) = 0
        THEN 1
        ELSE DATEDIFF(MONTH, c.startDate, getdate())
    END AS Months
...

但我看不出这有什么意义,因为这在逻辑上是错误的。用DATEDIFF(MONTH, c.startDate, getdate()) + 1来计算所有涉及的月份,包括开始月份和结束月份,会更有意义。因此,JAN到JAN将是1,JAN到FEB将是2,等等。

相关问题