【问题标题】:How to query database where date and time field are separate?如何查询日期和时间字段分开的数据库?
【发布时间】:2010-06-07 20:41:14
【问题描述】:

在表格中,时间和日期字段是两个独立的字段。我需要进行类似这样的查询,给出日期和时间

编辑 我的查询:-

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

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

【问题讨论】:

  • 字段是存储为纯文本还是实际日期列?如果是这样,时间字段存储的日期是什么?

标签: sql-server tsql


【解决方案1】:

使用您的数据模型:

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

但理想情况下,您可以拥有一个具有完整日期和时间DateTimeFieldcomputed 列,并且只查询与此相关的。如果这是您经常执行的查询,那么您可以使该计算列持久化,甚至在该列上创建索引。如果您使用 DATETIME 数据类型(如 Cade 的回答所示),则在 SQL Server 2008 中创建此计算列很简单:

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

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

【讨论】:

    【解决方案2】:

    @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 子句将其考虑在内。

    【讨论】:

    • 我已经这样做了,但结果不准确。请参阅上面我编辑的问题
    • 现在工作。唯一的问题是我必须在时间字段中传递日期。像这样:- 从 Table1 中选择 DateField、TimeField,其中 DateField
    【解决方案3】:

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

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

    请注意,这可能不是 SARG'able。

    我在这里假设一列是 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-31
      • 2019-08-18
      • 2021-01-23
      • 1970-01-01
      • 2016-07-09
      • 2011-06-12
      • 2015-10-01
      • 2011-09-26
      相关资源
      最近更新 更多