如何查询日期和时间字段分开的数据库?

时间:2010-06-07 20:41:15

标签: sql-server tsql

在表格中,时间和日期字段是两个单独的字段。我需要进行这样的查询,给出所有记录日期和时间< = givenDateTime。我该怎么办?

EDIT 我的问题: -

select DateField, TimeField from Table1 where DateField <= '07/26/2009' and TimeField <= '16:26:20'

结果是: -

2008-04-22 00:00:00.000 1899-12-30 23:59:58.000

2009-04-15 00:00:00.000 1899-12-30 23:59:56.000

2006-06-06 00:00:00.000 1899-12-30 23:59:53.000

在结果中查看上面的时间。错了

3 个答案:

答案 0 :(得分:1)

使用您的数据模型:

select  DateField, 
        TimeField 
from    Table1 
where   (DateField < '07/26/2009')
    or  (DateField = '07/26/2009' and TimeField <= '16:26:20')

但理想情况下,您可以拥有一个computed列,其中包含完整的日期和时间DateTimeField,只需查询相对于此的列。如果这是您经常进行的查询,那么您可以使此计算列保持不变,甚至可以在此列上创建索引。如果您使用DATETIME数据类型(如Cade的答案中所示),则在SQL Server 2008中创建此计算列是微不足道的:

DateTimeField AS CONVERT(DATETIME, DateField + TimeField) PERSISTED NOT NULL

如果是SQL Server 2005,您可能需要进行一些转换。

答案 1 :(得分:0)

@givenDateTime分解为日期组件和时间组件,并使用AND构建WHERE子句:

DECLARE @givenDate DATETIME 
SELECT @givenDate = DATEADD(dd, 0, DATEDIFF(dd, 0, @givenDateTime))

DECLARE @givenTime DATETIME 
SELECT @givenTime =  CONVERT(varchar(2),
      CASE
           WHEN DATEPART([hour], @givenDateTime) > 12 THEN CONVERT(varchar(2), (DATEPART([hour], @givenDateTime) - 12))
           WHEN DATEPART([hour], @givenDateTime) = 0 THEN '12'
           ELSE CONVERT(varchar(2), DATEPART([hour], @givenDateTime))
      END
 ) + ':' +
 CONVERT(char(2), SUBSTRING(CONVERT(char(5), @givenDateTime, 108), 4, 2)) + ' ' +
 CONVERT(varchar(2),
      CASE
           WHEN DATEPART([hour], @givenDateTime) > 12 THEN 'PM'
           ELSE 'AM'
      END
 ) 

SELECT * FROM myTable
WHERE tableDate <= @givenDate AND tableTime <= @givenTime

here获取日期转换。 时间转换取自here

请注意,@givenTime的日期为01 Jan 1900(加上时间),因此请确保您的where子句将此考虑在内。

答案 2 :(得分:0)

您可以天真地添加日期时间值。

http://cloudexchange.cloudapp.net/stackoverflow/q/2558

请注意,这可能不是SARG。

我假设这一列是SQL Server 2008 DATE,一个是TIME。

-- Datetime Combination Example 
SELECT CAST(dt AS datetime) + CAST(tm AS datetime) AS dtm
FROM (
    SELECT CAST('6/7/2010' AS DATE) AS dt, CAST('12:34:00' AS TIME) AS tm
) AS X

如果他们已经是日期时间:

SELECT dt + tm AS dtm
FROM (
    SELECT CAST('6/7/2010' AS DATETIME) AS dt, CAST('12:34:00' AS DATETIME) AS tm
) AS X