Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 变量中的日期计算_Sql_Sql Server 2005 - Fatal编程技术网

Sql 变量中的日期计算

Sql 变量中的日期计算,sql,sql-server-2005,Sql,Sql Server 2005,我正在尽力设置一个日期变量,以便以后比较。我想要一些基本上说: 如果当月的当前日期小于11,则日期为上月的10日 如果当月的当前日期大于或等于11,则日期为本月10日 日期为2012年11月6日预期产出: @PODate = 10/10/2012 @PODate = 11/10/2012 日期为2012年11月16日预期产出: @PODate = 10/10/2012 @PODate = 11/10/2012 目前我所拥有的是: DECLARE @PODate as DATETIME S

我正在尽力设置一个日期变量,以便以后比较。我想要一些基本上说:

如果当月的当前日期小于11,则日期为上月的10日 如果当月的当前日期大于或等于11,则日期为本月10日

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

@PODate = 10/10/2012
@PODate = 11/10/2012
日期为2012年11月16日预期产出:

@PODate = 10/10/2012
@PODate = 11/10/2012
目前我所拥有的是:

DECLARE @PODate as DATETIME
Set @PODate = Convert(varchar(8),GetDate(),1)
任何提示或帮助都将不胜感激。谢谢

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='2013年1月11日',@PODate将为'2013年1月10日',如果@currDate='2013年1月7日',@PODate将为'2012年12月10日'

如果@currDate='2013年1月11日',@PODate将是'2013年1月10日',如果@currDate='2013年1月7日',@PODate将是'2012年12月10日'

尝试以下方法:

试试这个:

演示


上演示,尽量使其简单明了:

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天,我们使用一个小写表达式减去一个月

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


不可否认,我的解决方案中有两个字符串,但这些字符串是固定不变的。重要的是,它们都用于同一年和同一个月,第二个字符串用于该月的第10个月,并且格式明确。

尽可能简单:

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天,我们使用一个小写表达式减去一个月

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


诚然,在我的解决方案中有两个字符串,但这些是固定不变的字符串。重要的是,它们都用于同一年和同一个月,第二个用于本月的第10个,格式明确。

非常有效,Damien!!也谢谢你的提示。。。我非常擅长Excel,试图在SQL方面做得更好-所以每一个提示都会帮上大忙!!工作得很有魅力,达米恩!!也谢谢你的提示。。。我非常擅长Excel,试图在SQL方面做得更好-所以每一个提示都会帮上大忙!!