目前多数应用程序需要从数据库中获取日期型(Datetime和SmallDatetime)列的数据。有时候,需要获取特定日期的数据,另一方面,可能需要获取指定年或月份的数据或者想得到两个不同日期之间的所有数据。另外,你可能需要获取输入给定的年,月,日返回首末刻录的数据。本篇将介绍基于日期型(Datetime和SmallDatetime)列的选取数据的问题。

DATE_SAMPLE TABLE

为了说明问题,这里使用一个示例表,暂且叫Date_Sample表,并插入一些以下数据:

RECORD SAMPLE_DATE

------------------------------------- ---------------------------

1 2001-11-08 00:00:00.000

2 2002-04-08 16:00:00.000

3 2003-04-12 16:59:00.000

4 2003-04-09 00:00:00.000

5 2003-04-09 08:00:00.000

6 2003-04-09 14:58:00.000

7 2003-04-09 23:59:00.997

8 2003-04-10 00:00:00.000

9 2003-04-12 00:00:00.000

10 2003-05-10 00:00:00.000

错误之一

在搜索有关日期型数据时,对于SQL程序员新手来说有许多常犯的错误,这一部分将向你介绍一些技巧。

首先介绍的是获取表中Sample_Date值等于’2003-04-09’的所有数据。代码如下:

SELECT * FROM DATE_SAMPLE WHERE SAMPLE_DATE = '2003-04-09'

运行上面代码后,仅返回记录4,那么为什么记录5、6、7没有返回呢?这里要记住的一点是:Datetime或SmallDate列不仅包含Date也包含Time。在我们这个例子中,Sample_Date是DateTime型,因此,所有的数据存储都包含时间,精确到微秒。当指定搜索的日期型列包含如上面例子所示的值时,SQL服务器首先需要将字符串’2003-04-09’转换为一个日期和时间的值以和Sample_Date列类型匹配,此转换结果为:2003-04-09 00:00:00:000’。

错误之二

使用如BETWEEN关键字的语句:

SELECT * FROM DATE_SAMPLE WHERE SAMPLE_DATE between '2003-04-09'

AND '2003-04-10'

搜索两个日期范围间的数据

SELECT * FROM DATE_SAMPLE WHERE SAMPLE_DATE >= '2003-04-09' AND SAMPLE_DATE <'2003-04-10'

使用DATEPART函数

另外一种方法是使用DATEPART函数来完成,使用该函数在构造Where语句将Sample_Date列分列为年、月、日三列即可。如下代码所示:

SELECT * FROM DATE_SAMPLE
WHERE
DATEPART(YEAR, SAMPLE_DATE) = '2003' AND
DATEPART(MONTH,SAMPLE_DATE) = '04' AND
DATEPART(DAY, SAMPLE_DATE) = '09'

使用FLOOR函数

通过使用FLOOR和CAST两个函数来去除日期中的时间部分,CAST函数将DATETIME变量转换为一个DECIMAL值,然后FLOOR函数取该值最近的整数值,然后再使用CAST函数做进一步的DECIMAL到DATETIME的转换。

SELECT * FROM DATE_SAMPLE WHERE
CAST(FLOOR(CAST(SAMPLE_DATE AS FLOAT))AS DATETIME) =
'2003-04-09'
待续....