首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据指定日期SQL 2008选择下一个日期

根据指定日期SQL 2008选择下一个日期
EN

Stack Overflow用户
提问于 2014-06-12 09:45:59
回答 2查看 56关注 0票数 0

我有一个表,其中有一个日期字段,这个日期字段称为协议日期,是在达成支付协议时创建的日期。我正在设法计算下一次付款是在这个月的某一天到期的。

例如,如果协议日期是2014年1月21日-2014年,那么下一次付款将是21-6月-2014年。这是我被困的部分,我如何让它忽略前几个月,只是检查下一个到期日?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-12 10:56:07

代码语言:javascript
复制
SELECT
  [agreement date],
  CASE
  WHEN [payment date this month] >= CAST(GETDATE() AS date)
  THEN [payment date this month]
  ELSE [payment date next month]
  END AS [payment date]
FROM (
  SELECT
    [agreement date],
    DATEADD(
      MONTH,
      DATEDIFF(MONTH, [agreement date], GETDATE()),
      [agreement date]) AS [payment date this month],
    DATEADD(
      MONTH,
      DATEDIFF(MONTH, [agreement date], GETDATE()) + 1,
      [agreement date]) AS [payment date next month]
) AS sub

DATEDIFF(MONTH, x, y)完全忽略了xy的月一天。如果x在一月份的某个位置,而y在二月的某个位置,那么DATEDIFF(MONTH, x, y)就是其中之一,即使差别仅仅是一天。

因此,您可以使用DATEDIFF(MONTH, [agreement date], GETDATE())获取要添加的月数,这将确保您获得本月的付款日期。再加上一个到下个月付款日期。

在此之后,简单地将[payment date this month]GETDATE()进行比较,以确定它是否已经通过。

票数 1
EN

Stack Overflow用户

发布于 2014-06-12 10:39:31

也许有一种更优雅的方法可以做到这一点,但这应该适用于每月到期的付款:

代码语言:javascript
复制
SELECT [agreement date], 
CASE WHEN DATEPART(DAY, [agreement date]) > 28 THEN 
    CONVERT(DATE, CAST(DATEPART(YEAR, GETDATE()) AS NVARCHAR(4)) + '/' + CAST(DATEPART(MONTH, GETDATE()) AS NVARCHAR(2)) + '/28', 111) 
ELSE 
    CONVERT(DATE, CAST(DATEPART(YEAR, GETDATE()) AS NVARCHAR(4)) + '/' + CAST(DATEPART(MONTH, GETDATE()) AS NVARCHAR(2)) + '/' + CAST(DATEPART(DAY, [agreement date]) AS NVARCHAR(2)), 111) 
END AS [Next payment due date]
FROM yourTable

请注意,如果协议日期的日期已经过了,它将在该月28日生成付款到期日期,以说明任何可能出现的无效日期问题(如2月31日)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24181274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档