-2

日期采用 Y2K 日期字符串格式

例如)1120104=20120104

运行 SQL Server 2008

4

3 回答 3

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- 计算月底很糟糕,尤其是在 2 月,尤其是如果您有任何日期/时间数据类型更改的潜力。看:

如果您有 1900 年代的日期,那么它会涉及更多:

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

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

于 2013-03-06T17:39:34.340 回答
1

第一个建议:将日期存储为数据类型 date 或 datetime 以便您可以实际搜索它们。

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

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

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

于 2013-03-06T17:27:34.883 回答
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
于 2013-03-06T17:42:51.830 回答