SQL:如何查找2个日期之间的记录

时间:2013-03-06 17:24:05

标签: sql sql-server

日期为Y2K日期字符串格式

例如)1120104 = 20120104

运行SQL Server 2008

3 个答案:

答案 0 :(得分:3)

我同意@usr,首先,停止以这种方式存储日期。

如果你不能,那么添加一个计算列(你甚至可以坚持和/或索引):

ALTER TABLE dbo.MyTable ADD RealDate 
 AS CONVERT(DATE, RIGHT(col, 6), 12);

如果你不能这样做,那么创建一个视图:

CREATE VIEW dbo.SmarterView
AS
  SELECT /* other columns, */ 
    RealDate = CONVERT(DATE, RIGHT(col, 6), 12)
  FROM dbo.MyTable;

然后:

SELECT ... FROM dbo.MyTable -- or dbo.SmarterView
  WHERE RealDate >= @Start 
  AND RealDate < DATEADD(DAY, 1, @End); 

开放式范围远远优于BETWEEN - 计算月末很糟糕,特别是在二月份,特别是如果您有可能进行日期/时间数据类型更改。参见:

如果您的日期在20世纪20年代,那么它会涉及更多:

CONVERT(DATE, CONVERT(CHAR(2), 19 + CONVERT(INT, LEFT(col, 1))) + RIGHT(col, 6), 112);

无论如何,这是无关紧要的,因为OP声明他们会将其正确存储为DATE

答案 1 :(得分:1)

第一条建议:将日期存储为数据类型日期或日期时间,以便您可以实际搜索它们。

如果您不想这样,则需要先将字符串转换为日期,以便您可以搜索它们:

where convert(date, my_nasty_string_column_with_dates) between @a and @b

这是一个性能问题,因为查询永远无法在索引上进行搜索。

答案 2 :(得分:1)

您应该能够在Y2K日期与另一个日期进行简单的相等检查。如果你想将Y2K转换为DateTime,那么你需要添加19000000然后转换它就像这个例子:

DECLARE @Y2KDate INT
SET @Y2KDate = 1120104
DECLARE @DateTime DateTime
SET @DateTime = CONVERT(DATETIME, CONVERT(CHAR(8), @Y2KDate + 19000000), 112) 
PRINT @DateTime

打印以下输出

1120104
20120104
Jan  4 2012 12:00AM