【问题标题】:How to get start/end date from single date column from a SQL Server table如何从 SQL Server 表中的单个日期列获取开始/结束日期
【发布时间】:2019-03-14 15:19:48
【问题描述】:

您能帮我解决我的问题吗?我正在使用 SQL Server 数据库,我想从开始日期 + 月份或日期获取结束日期。

  • 如果月份不为空,则将其添加到开始日期以获取结束日期
  • 如果日期不为空,则将其添加到开始日期以获取结束日期

我有这张桌子:

| ID | startdate |  month |  day  | 
| 1  | 2019-03-05|   3    | null  |
| 2  | 2019-03-05|  null  |   30  |

期望的输出:

| ID | startdate |  month |  day  |  enddate  |
| 1  | 2019-03-05|   3    | null  |2019-06-05 |
| 2  | 2019-03-05|  null  |   30  |2019-04-04 |

你能帮我写一个 SQL 查询吗?

【问题讨论】:

  • 当您在 2019 年 3 月 5 日添加 30 天时,它将给出 2019 年 4 月 4 日而不是 4 月 5 日,因此请在所需的输出中更正它。这是因为三月是31天。

标签: sql sql-server


【解决方案1】:

您可以使用以下查询来获得所需的结果

declare @TestDate table
(id int, startdate date, [month] int, [day] int)

insert into @TestDate
values
(1, '2019-03-05', 3, null)

insert into @TestDate
values
(1, '2019-03-05',  null, 30)

select Id,
    startdate,
    [month],
    [day],
    dateadd(day, isnull(day, 0), dateadd(month, isnull([month], 0), startdate)) as enddate
from @TestDate

【讨论】:

    【解决方案2】:

    您可以使用 Dateadd() 函数尝试以下查询。 DATEADD() 函数将时间/日期间隔添加到日期,然后返回日期。

    create table tblMonth (Id int, startdate date, month int, day int)
    insert into tblMonth values
    ( 1, '2019-03-05', 3, null),
    (1, '2019-03-05', null, 30)
    
    Select Id, startdate, month, day, DATEADD(MM, isnull(month,0), startDate) AS endDate
        from tblMonth
    

    要添加带有检查的日期,您可以使用 case 语句,如下所示。

    Select Id, startdate, month, day, 
        case when month is null then 
                DATEADD(dd, isnull(day, 0), startDate) 
            else
                DATEADD(mm, isnull(month,0), startDate) 
            end
        AS endDate
    from tblMonth
    

    Live Demo

    【讨论】:

    • 它适用于月份,但示例中的日期不起作用
    • @ahmed 检查修改后的查询。
    • @ahmed 如果它解决了您的问题,请您接受答案。
    • 如果月和日两列都有值怎么办?
    • @Mukesh Arora 这没什么大不了的,OP 比我们更了解在这种情况下如何处理和做什么,但在我的情况下,其他部分会起作用。
    【解决方案3】:

    您可以在下面尝试 - 使用 dateadd() 函数

    select id, 
           startdate, 
           dateadd(case when month is null then dd else mm, coalesce(month,day),startdate) as enddate
    from tablename
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 2022-01-07
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      相关资源
      最近更新 更多