代码之家  ›  专栏  ›  技术社区  ›  Craig Angus karan

数据库不可知SQL,用于返回存储为时间戳的出生日期列表

  •  1
  • Craig Angus karan  · 技术社区  · 17 年前



    所选日期50年1月1日10.22.06.010101120

    如果我将日期与小时和分钟一起使用,SQL将只返回具有确切时间戳的行,而不返回仅用于日、月和年的行。

    SQL需要在Oracle、SQLServer、MySQL和DB2上工作。

    5 回复  |  直到 17 年前
        1
  •  2
  •   Jonathan Leffler    17 年前

    Oracle的日期类型早于SQL标准版本(Informix也是如此),这使得以DBMS中立的方式实现这一点非常困难(如果不是不可能的话)。当然,有一个问题是“为什么选择的数据表示包含时间”。

    在标准SQL中,显而易见的技术是将时间戳转换为日期。我们也没有一个明确的数据解释你必须搜索。

    SELECT CAST(DateOfBirth AS DATE), ...other columns...
        FROM TheMysteryTable         -- Why do people hate giving tables names?
        WHERE CAST(DateOfBirth AS DATE) =
              CAST(TIMESTAMP '1950-01-01 10.22.06.010101120' AS DATE)
    

    注意,由于强制转换,DBMS不太可能使用任何索引或任何东西。如果类型是正常的,那么查询将是:

    SELECT DateOfBirth, ...other columns...
        FROM TheMysteryTable
        WHERE DateOfBirth = DATE '1950-01-01'
    
        2
  •  1
  •   meepmeep    17 年前

    除了数据库抽象之外,最好的解决方案是首先对使用的datetime对象进行四舍五入,然后只需要一个通用SQL比较子句,它将在所有列出的数据库中起作用。

        3
  •  0
  •   Seb    17 年前

    没有ANSI日期格式,也没有字符串操作。任何代码都只能在特定的RDBMS中运行,如果不是一个的话。

    但是,如果您在RDBMS(比如PHP、Java等)之外获取所选日期,我建议在将其发送到查询之前对其进行清理;然后,您可以对字符串进行比较,这几乎适用于所有系统。

        4
  •  0
  •   Tom H zenazn    17 年前

    正如其他人所指出的,RDBMS在处理日期时间方面是非常不同的。 他们实际上遵循了ANSI-92标准,那么以下各项应该可以起作用:

    SELECT
         <column list>
    FROM
         <table name>
    WHERE
         CAST(birth_date AS DATE) = CAST(search_date AS DATE)
    

    可以

    SELECT
         <column list>
    FROM
         <table name>
    WHERE
         birth_date >= CAST(CAST(search_date AS DATE) AS DATETIME) AND
         birth_date < CAST(CAST(search_date AS DATE) + 1 AS DATETIME)
    
        5
  •  0
  •   SFA SFA    17 年前

    使用EXTRACT()

    推荐文章