从SQL Server 2008中的零件构造日期

从SQL Server 2008中的零件构造日期,sql,sql-server,case,datepart,Sql,Sql Server,Case,Datepart,我正在使用SQLServer2008并尝试形成一个查询,该查询将使用带有日期计算的CASEstatement返回两个日期中的一个,具体取决于计算结果是在当月的哪一天 目标是,如果查询中当前时间戳+提前期的计算结果介于1日和15日之间,则指定该月的15日。否则,请在当月的最后一天返回 例如,如果当前时间戳+前置时间=07/12/19,则返回07/15/19。如果该计算=07/16/19,则返回07/31/19 这似乎可以使用DATEFROMPARTS,但我相信因为我使用的是SQL Server 2

我正在使用SQLServer2008并尝试形成一个查询,该查询将使用带有日期计算的CASEstatement返回两个日期中的一个,具体取决于计算结果是在当月的哪一天

目标是,如果查询中当前时间戳+提前期的计算结果介于1日和15日之间,则指定该月的15日。否则,请在当月的最后一天返回

例如,如果当前时间戳+前置时间=07/12/19,则返回07/15/19。如果该计算=07/16/19,则返回07/31/19

这似乎可以使用DATEFROMPARTS,但我相信因为我使用的是SQL Server 2008,所以函数没有定义,这就是我返回的错误。有没有关于变通办法的想法

SQL:

试试这个

SELECT CAST(LEFT(CONVERT(varchar, CURRENT_TIMESTAMP + LEAD_TIME, 103 ),2) as int)
然后


您可以将日期的所有部分转换为VARCHAR,并将它们串在一起转换为yyyy-mm-dd格式,然后转换为DateTime

请注意,在ELSE语句中,获取当月最后一天的逻辑是转到下个月的第一天,然后使用DATEADD函数减去一天,在SQL Server 2012中引入,消除了对该逻辑的需要

SELECT CAST(LEFT(CONVERT(varchar, CURRENT_TIMESTAMP + LEAD_TIME, 103 ),2) as int)
CASE WHEN CAST(LEFT(CONVERT(varchar, CURRENT_TIMESTAMP + LEAD_TIME, 103 ),2) as int) < 15 THEN 
  ....
ELSE
  ....
END
 SELECT 
 ...
    CASE WHEN DATEPART(dd,(CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME)) BETWEEN 1 AND 15 
            THEN CONVERT(DATETIME, CONVERT(varchar, DATEPART(yyyy,(CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME)))+ '-' + CONVERT(VARCHAR, DATEPART (mm,(CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME)))  + '-' + CONVERT(VARCHAR, 15))
            ELSE DATEADD(DAY, -1, CONVERT(DATETIME, CONVERT(VARCHAR, DATEPART(yyyy,(CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME)))+ '-' + CONVERT(VARCHAR, DATEPART(mm,CURRENT_TIMESTAMP + MM.IAM_MAN_LEAD_TIME)+ 1)  + '-' + CONVERT(VARCHAR, 1)))
            END  AS 'LT_CALC'
...