我正在尽力设置日期变量,以便稍后进行比较。我想要一些基本上说的东西:
如果当前日期小于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)
任何提示或帮助将不胜感激。谢谢!!
答案 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'