变量中的日期计算

时间:2012-11-07 03:17:45

标签: sql sql-server-2005

我正在尽力设置日期变量,以便稍后进行比较。我想要一些基本上说的东西:

如果当前日期小于11,则日期是最后一个月的第10天 如果当前日期大于或等于11,那么日期是本月的第10天

日期是2012年6月11日预期产出:

@PODate = 10/10/2012

日期是11/16/2012预期产出:

@PODate = 11/10/2012

目前,我所拥有的只是:

DECLARE @PODate as DATETIME
Set @PODate = Convert(varchar(8),GetDate(),1)

任何提示或帮助将不胜感激。谢谢!!

4 个答案:

答案 0 :(得分:2)

尽量让它尽可能简单:

declare @PODate datetime
select @PODate = DATEADD(month,
   DATEDIFF(month,'20010110',CURRENT_TIMESTAMP) +
      CASE WHEN DATEPART(day,CURRENT_TIMESTAMP) <= 10 THEN -1 ELSE 0 END,
   '20010110')

周围的DATEADD / DATEDIFF对用于将日期标准化为当月的第10天。然后,如果日期小于或等于10日,我们使用小CASE表达式减去一个月。


无论您选择哪种解决方案,请尽量避免使用字符串操作。 SQL中datetime相关错误的常见原因是人们将日期视为字符串。适当保持数据类型通常是防止这些问题的最佳方法。

在我的解决方案中确实存在2个字符串,但这些是固定的常量字符串(重要的是它们都是同一年和月份,第二个是本月的第10个字符串)是一种明确的格式。

答案 1 :(得分:1)

试试这个:SQL Fiddle

DECLARE 
    @PODate as DATETIME,
    @LastMonth as DateTime,
    @strDate as Varchar(50)

set @PODate = '11/16/2012'
set @LastMonth = DATEADD(MONTH, -1, @PODate)


if(DAY(@PODate) < 11)
   SET @strDate = CAST(MONTH(@LastMonth) AS VARCHAR)+'/10/'+CAST(YEAR(@LastMonth) AS VARCHAR)
else
   SET @strDate = CAST(MONTH(@PODate) AS VARCHAR)+'/10/'+CAST(YEAR(@PODate) AS VARCHAR)

Select CAST(@strDate AS DateTime)

答案 2 :(得分:1)

DECLARE @PODate date = '20121116'
SELECT CASE WHEN DATEPART(day, @PODate) < 11 THEN DATEADD(mm, DATEPART(mm, GETDATE()) - DATEPART(mm, @PODate) - 1, DATEADD(day, 10 - DATEPART(day, @PODate), @PODate))
                                             ELSE DATEADD(mm, DATEPART(mm, GETDATE()) - DATEPART(mm, @PODate), DATEADD(day, 10 - DATEPART(day, @PODate), @PODate)) END

SQLFiddle上的演示

答案 3 :(得分:0)

DECLARE @currDate DATE = dbo.GetDate()
DECLARE @day INT =  day(@currDate)
DECLARE @month INT 
DECLARE @year INT

DECLARE @PODate DATE

IF( @day >= 11)
BEGIN
    SET @month = month(@currDate)
    SET @year = year(@currDate)
END 
ELSE BEGIN
    SET @month =  month(dateadd(m,-1,@currDate))
    SET @year = year(dateadd(m,-1,@currDate))       
END

SET @PODate = convert(DATE,'10-' + convert(VARCHAR,@month) + '-' + convert(VARCHAR,@year))

PRINT    @PODate

如果@currDate = '11-jan-2013'@PODate'10-jan-2013',如果@currDate = '07-jan-2013',则@PODate'10-Dec-2012'