日期采用 Y2K 日期字符串格式
例如)1120104
=20120104
运行 SQL Server 2008
好吧,我同意@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
- 计算月底很糟糕,尤其是在 2 月,尤其是如果您有任何日期/时间数据类型更改的潜力。看:
如果您有 1900 年代的日期,那么它会涉及更多:
CONVERT(DATE, CONVERT(CHAR(2), 19 + CONVERT(INT, LEFT(col, 1))) + RIGHT(col, 6), 112);
无论如何,这无关紧要,因为 OP 声明他们会将其正确存储为DATE
.
第一个建议:将日期存储为数据类型 date 或 datetime 以便您可以实际搜索它们。
如果您不希望这样,您需要先将字符串转换为日期,以便您可以搜索它们:
where convert(date, my_nasty_string_column_with_dates) between @a and @b
这是一个性能问题,因为查询将永远无法在索引上查找。
您应该能够通过简单的相等性检查在 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