【问题标题】:Check date interval with SQL Server使用 SQL Server 检查日期间隔
【发布时间】:2009-12-23 16:53:08
【问题描述】:
您好,在存储过程中,我想选择间隔为一个月的行,其中
@Anno 是开始的年份,@Mese 是日期开始的月份。我试试这个:
WHERE FinePeriodo >= CAST((@Anno + '-' + @Mese + '-01 00:00:00') as datetime)
AND FinePeriodo <
DATEADD(month, 10, CAST(
(@Anno + '-' + @Mese + '-01 00:00:00') as datetime))
但它不起作用。
我该怎么办?
谢谢
【问题讨论】:
标签:
sql-server
stored-procedures
date
【解决方案1】:
首先,为了确保无论服务器上的语言和区域设置如何,您的日期算法都能正常工作,请使用 ISO-8601 格式 YYYYMMDD 作为日期。
在这种情况下,您应该能够执行以下操作:
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
-- this assume @Anno and @Mese are already VARCHAR variables!
SET @StartDate = CAST(@Anno + RIGHT('00'+@Mese, 2) + '01' AS DATETIME)
SET @EndDate = DATEADD(MONTH, 1, @StartDate)
然后在你的 WHERE 子句中,使用:
WHERE FinePeriodo BETWEEN @StartDate AND @EndDate
这对你有用吗?
【解决方案2】:
以下代码有效:
declare @anno VARCHAR(4)
declare @mese VARCHAR(2)
SET @Anno = '2006'
SET @mese = '6'
SELECT CAST((@Anno + '-' + @Mese + '-01 00:00:00') as datetime) as BeginMOnth,
DATEADD(month,10,CAST((@Anno + '-' + @Mese + '-01 00:00:00') as datetime)) as EndMonth
select [name],crDate from sysobjects
WHERE crDate >= CAST((@Anno + '-' + @Mese + '-01 00:00:00') as datetime)
AND crDate < DATEADD(month,10,CAST((@Anno + '-' + @Mese + '-01 00:00:00') as datetime))
使用 sysobjects 表进行测试。
- 您的搜索字段是实际日期吗(而不是字符类型)
- 变量中是否有多余的空格等
- 您收到错误或只是返回错误的记录
【解决方案3】:
试试这个:(使@Anno和@Mese整数)
Where FinePeriodo Between DateAdd(month, 12*(@Anno-1900) + @Mese, 0)
And DateAdd(month, 12*(@Anno-1900) + @Mese + 1, 0)