【问题标题】:Extracting Dates in SQL Server在 SQL Server 中提取日期
【发布时间】:2014-07-16 01:10:26
【问题描述】:

我有一个包含诊所信息的数据库。

每个诊所都有一个开业日期(例如,2014-05-23 00:00:00)和一个名为 MIO(monthsInOperation) 的字段,它基本上是诊所运营的月数。

对于每个诊所,我需要基于当前运营月份 (MIO) 格式的日历月份和年份(例如,7 月至 13 日),在数据库中可以是 0、1、2、....等等。

我知道我需要使用DATEADD()DATEPART()DATEDIFF() 函数。但我无法得到想要的结果。

最后一个诊所的答案应该是 2012 年 2 月

【问题讨论】:

  • 你能提供一些样本数据和想要的结果吗?
  • 您能告诉我们您尝试了哪些没有奏效的方法吗?此外,由于您有所需的确切日期,因此不需要像 DATEADD()DATEDIFF() 这样的函数。
  • @STLDeveloper 我有开放日期和 MonthsInOperation 字段,我需要知道对应 MonthInOperation 的日历月份和年份。比如开盘日期是(2013-05-23 00:00:00),MIO是13,那么MIO是0、1、2、3时日历月份和年份的值是多少等等。我希望我清楚吗?
  • @GordonLinoff 上面的解释清楚了吗?
  • @user3681350 - 不幸的是,我没有关注你。在上面的示例中,如果 MIO 值为 12,您希望答案是什么?

标签: sql sql-server


【解决方案1】:

如果我误解了你的问题,请纠正我,但是你有什么理由不能做这样的事情吗?

SELECT DATEADD(MONTH, MonthsInOperation, OpenDate) FROM Clinics

这不会只给你一个月和一年,但无论如何 SQL 中都没有这种类型。您可以在客户代码上处理生成的DATEDATETIME,并将ToString 处理为您想要的格式(MM-yyyy 或您拥有的格式)。您也可以使用@ 将它们分开987654321@ 和 YEAR(DATE) 函数,虽然我个人不会打扰。您只想查看月份和年份,这似乎更像是一个 UI 问题。

SELECT MONTH(DATEADD(MONTH, MonthsInOperation, OpenDate)), YEAR(DATEADD(MONTH, MonthsInOperation, OpenDate))

听起来这将输出您需要使用的两列:月份和年份。

然而,

SELECT DATENAME(MONTH, DATEADD(month, MonthsInOperation, OpenDate)) + "-" + YEAR(DATEADD(MONTH, MonthsInOperation, OpenDate)))

如果我理解正确的话,应该再次给出你想要的。

【讨论】:

  • @user3681350 并不比我以前更多。您对这个解决方案的问题仅仅是格式吗?这将返回您作为示例为每种情况提供的值。如果您关心的是格式,那就另当别论了。
  • 我想,你能不能试着把这个选择和你的另一个一起运行,然后告诉我 values 哪里错了。注意,值,而不是格式。
  • 我可以自己格式化,这不是问题,我只是在寻找打开日期和monthsinoperation的值对应的“年月”。例如上图诊所#8 于 2011 年 3 月开业,因此基于 MIO(即 11),月份和年份将是 2012 年 2 月(我需要的答案)。
  • 其实我的错,你上面写的解决方案有效。它会给我想要的结果,然后它只是一个格式的问题。
  • @user3681350 如果这完全回答了您的问题,如果您接受我的回答以在将来帮助人们并将此问题从未回答的队列中删除,我将不胜感激。提前致谢!
【解决方案2】:

如果您需要每个诊所营业的月份列表,您可以这样做。您需要的第一件事是一个数字列表,其余的很简单。

with n as (
      select 0 as n
      union all
      select n + 1
      from n
      where n < 50
     )
select c.*, year(dateadd(month, n.n, c.opening_date)),
       month(dateadd(month, n.n, c.opening_date))
from clinics c join
     n
     on n.n <= c.mio;

我选择将年份和月份格式化为两个单独的数字列。您可以使用datename()convert() 来获取特定格式。

编辑:

如果你只想要最近一个月,那就更简单了:

select c.*, year(dateadd(month, c.mio, c.opening_date)),
       month(dateadd(month, c.mio, c.opening_date))
from clinics c;

【讨论】:

  • 它没有给出正确的答案,我已经编辑了我的帖子并包含了示例数据。不用担心数值,它也包括预测,所以你上面看到的MIO与实际开盘日期不符。
  • 这怎么不能产生正确的答案?这是一个生成日期列表的 SQL 小提琴:sqlfiddle.com/#!6/d41d8/20253.
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多