需要在 SQL Server 2008 中查找两个日期之间的日期
Posted
技术标签:
【中文标题】需要在 SQL Server 2008 中查找两个日期之间的日期【英文标题】:Need to find date's between 2 date's in SQL Server 2008 【发布时间】:2010-03-14 15:26:21 【问题描述】:我需要查询帮助以查找 2009 年 12 月 12 日至 2010 年 2 月 31 日之间的所有日期
在 SQL Server 2008 中
我试试这个:
SELECT convert(varchar(50), MyDate, 103)
where convert(varchar(50), MyDate, 103) >= '31/12/2009' and convert(varchar(50), MyDate, 103) <='31/02/2010'
但它给了我错误的结果
为什么?
【问题讨论】:
你应该用一个问题的例子来澄清你的问题。 【参考方案1】:我对这个问题有不同的解释:“如何生成一定范围内的所有日期?”
这是一个解决方案:
--define start and end limits
Declare @todate datetime, @fromdate datetime
Select @fromdate='2009-03-01', @todate='2009-04-10'
;With DateSequence( Date ) as
(
Select @fromdate as Date
union all
Select dateadd(day, 1, Date)
from DateSequence
where Date < @todate
)
--select result
Select * from DateSequence option (MaxRecursion 1000)
有一个很好的 article 展示了如何使用 CTE 生成序列(数字、日期、时间)。
编辑:
经过澄清,问题似乎是输入的日期格式:dd/mm/yyyy。
SQL Server 需要格式 mm/dd/yyyy。
我会在运行 select 语句之前简单地对其进行转换:
-- Assuming two variables, @inputFromDate and @inputToDate, in the format of dd/mm/yyyy...
declare @fromDate varchar(10), @toDate varchar(10)
set @fromDate =
substring(@inputFromDate, 3, 2) + '/' +
substring(@inputFromDate, 1, 2) + '/' +
substring(@inputFromDate, 7, 4)
set @toDate =
substring(@inputToDate, 3, 2) + '/' +
substring(@inputToDate, 1, 2) + '/' +
substring(@inputToDate, 7, 4)
select * from SomeTable where dateCol >= @fromDate and dateCol < @toDate
-- you can change the < or >= comparisons according to your needs
【讨论】:
是的,我认为 OP 也是这个意思。 感谢您的帮助,我需要一些简单的选择...#03/03/2010..between...我需要这种日期格式(dd/mm/yyyy)跨度> 【参考方案2】:如果MyDate
列看起来是datetime
,那么它已经采用正确的“格式”。 不要在谓词条件中将其转换为 varchar(50)
- 这会使您的查询不可分割,并且会影响您可能拥有的任何索引的性能。
相反,将您的参数作为date
或datetime
实例:
SELECT ...
FROM MyTable
WHERE MyDate >= @BeginDate
AND MyDate <= @EndDate
您的查询不应依赖于输入参数中的特定日期格式 - 这些参数不是varchar
类型,而是datetime
(或date
)。当您从应用程序所在的任何环境运行此查询或存储过程并提供绑定参数时(您正在使用绑定参数,对吗?),所述库将自动处理任何格式问题。
如果您尝试在日期的字符表示上使用>=
和<=
运算符,使用除ISO 标准yyyymmdd
之外的任何格式,您将得到错误的结果,因为字母顺序与时间顺序。不要这样做。
如果您只是需要编写一个临时查询,即它不是在任何编程环境中运行的,那么就不要使用dd/mm/yyyy
格式。改用 ISO 日期格式;它是明确的并且可以隐式转换为 datetime
值:
SELECT ...
FROM MyTable
WHERE MyDate >= '20091231'
AND MyDate <= '20100231'
老实说,我认为没有其他解决方案是可以接受的。对于临时查询,始终使用明确的 ISO 日期标准。对于连接到数据库的应用程序,始终使用绑定参数。如果您正在做其他事情,那么您编写的代码要么不可靠、不安全,要么两者兼而有之。
【讨论】:
【参考方案3】:BOL 总是一个很好的参考...
以BETWEEN开头
【讨论】:
【参考方案4】:你试过了吗:
DECLARE @FROMDATE DATETIME
DECLARE @TODATE DATETIME
SET @FROMDATE = GETDATE()
SET @TODATE = GETDATE()+7
;WITH DATEINFO(DATES) AS (SELECT @FROMDATE UNION ALL SELECT DATES + 1 FROM DATEINFO WHERE DATES < @TODATE)
SELECT * FROM DATEINFO OPTION (MAXRECURSION 0)
【讨论】:
以上是关于需要在 SQL Server 2008 中查找两个日期之间的日期的主要内容,如果未能解决你的问题,请参考以下文章
如何从 sql server 2008 中具有不同 TaskIds 的表中查找日期?