日期为Y2K日期字符串格式
例如)1120104
= 20120104
运行SQL Server 2008
答案 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