在表格中,时间和日期字段是两个单独的字段。我需要进行这样的查询,给出所有记录日期和时间< = 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
在结果中查看上面的时间。错了
答案 0 :(得分:1)
使用您的数据模型:
select DateField,
TimeField
from Table1
where (DateField < '07/26/2009')
or (DateField = '07/26/2009' and TimeField <= '16:26:20')
但理想情况下,您可以拥有一个computed
列,其中包含完整的日期和时间DateTimeField
,只需查询相对于此的列。如果这是您经常进行的查询,那么您可以使此计算列保持不变,甚至可以在此列上创建索引。如果您使用DATE
和TIME
数据类型(如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
请注意,@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