在SQL Server中提取日期

时间:2014-07-16 01:10:26

标签: sql sql-server

enter image description here

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

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

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

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

上一次诊所的答案应该是2012年2月

2 个答案:

答案 0 :(得分:4)

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

SELECT DATEADD(MONTH, MonthsInOperation, OpenDate) FROM Clinics

这不会给你一个月和一年,但是无论如何SQL中都没有这样的类型。您可以在客户的代码上处理生成的DATEDATETIME,并ToString使其符合您希望的格式(MM-yyyy或您拥有的内容)。也可以使用MONTH(DATE)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)))
如果我理解你的话,

应该准确地给出你想要的东西。

答案 1 :(得分:0)

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

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;