数据库无关SQL用于存储为一个时间戳出生日期返回列表
-
22-08-2019 - |
题
如果我需要在出生日期是存储无小时和分钟,但日期我要搜索与包括小时和分钟是返回哪里日期只有一天匹配的所有行的最好方式,每月搜索和年
即。点击 存储为01-JAN-50 10.22.06.000000000结果 日期选择01-JAN-50 10.22.06.010101120
如果我使用日期与小时和分钟的SQL将只具有确切时间戳,而不是那些仅仅是日,月和年返回行。
在SQL需要对了Oracle,SQLServer,MySQL和DB2工作。
解决方案
Oracle的DATE型预日期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)
但是,假设你写的“日期搜索”的文字。如果它是一个主机变量,则主机变量的类型应该是日期,而不是TIMESTAMP。和出生日期栏也许应该是日期,而不是一个时间戳。除非时间的部分是有关你不应该使用TIMESTAMP - 它浪费存储和它浪费计算时间
请注意,由于铸件中,这是不可能的数据库管理系统将能够使用任何索引或任何东西。如果类型是健全的,则该查询将是简单地:
SELECT DateOfBirth, ...other columns...
FROM TheMysteryTable
WHERE DateOfBirth = DATE '1950-01-01'
其他提示
如任何溶液将需要日期和日期时间的对象操作,那么就没有系统无关的解决方案 - 将每一个具有不同的功能为这些对象
最好的解决方案,比数据库抽象其他,将四舍五入的日期时间被对象第一次使用,则仅一个通用的SQL比较子句是必需的,这将是在所有列出的DB功能。
没有ANSI日期格式,也没有字符串操作。任何代码将只在某些RDBMS的运行,如果不只是一个。
不过,如果你得到你的RDBMS之外您选择的日期(比如PHP,Java等),我建议在查询发送之前消毒它;然后你可以比较串来串,这应该在几乎所有的系统。
正如其他人所指出的那样,RDBMS的是非常不同的,当涉及到处理日期时间。 如果强>他们实际上遵循的ANSI-92标准,那么下面应该工作:
SELECT
<column list>
FROM
<table name>
WHERE
CAST(birth_date AS DATE) = CAST(search_date AS DATE)
在不会是最有效的方式做到这一点,虽然,因为这将排除使用上的日期为大多数系统的索引。下面的可能作为完全符合ANSI-92兼容的数据库工作:
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)
使用EXTRACT()