有没有办法编写一个相当于
select * from log_table where dt >= 'nov-27-2009' and dt < 'nov-28-2009';
但是您只能指定 1 个日期,并说您想要一整天的结果,直到下一天。
我只是在编造这个,但形式如下:
select * from log_table where dt = 'nov-27-2009':+1;
我不相信有一种方法可以移植到所有 RDBMS。
检查我的一个参考资料(SQL Cookbook)表明没有一个 RDBMS 以完全相同的方式解决问题。我建议您查看该书的第 8 章,其中涵盖了 DB2、Oracle、PostgreSQL、MySQL 的所有不同方法。
不过,我不得不在SQLite中处理这个问题,而 SQL Cookbook 并没有解决那个 RDBMS,所以我会在这里稍微提一下。 SQLite 没有日期/时间数据类型;您必须通过存储所有日期/时间数据来创建自己的数据,TEXT
并确保您的应用程序强制执行其格式设置。SQLite 确实有一组日期/时间转换函数,允许您添加名义日期/时间,同时将数据维护为字符串。但是,如果您需要将两个持续时间 (HH:MM:SS) 彼此相加,则根据您存储在您视为日期/时间数据的文本列中的数据,您必须编写自己的职能(搜索“定义 SQLite 用户函数”)并在运行时通过调用sqlite3_create_function()
. 如果您想要一些添加时间值的用户函数的示例,请告诉我。
对于 MS SQL Server,请查看DATEPART。
/* dy = Day of Year */
select * from log_table where datepart(dy, dt) = datepart(dy, '2009-nov-27');
使用 SQL Server,您可以
Select * From table
Where dt >= DateAdd(day, DateDiff(day, 0, @ParamDate), 0)
And dt < DateAdd(day, DateDiff(day, 0, @ParamDate), 1)
只要您正在处理相应数据类型的日期数据类型,以下将起作用:
t.date_column + 1
...将在给定日期上增加一天。但是我还没有找到一个允许将隐式数据类型转换为日期的数据库。
SELECT '12-10-2009' + 1
...将在 SQL Server 上失败,因为 SQL Server 仅在与 datetime 数据类型列进行比较时执行隐式转换。所以你需要使用:
SELECT CONVERT(DATETIME, '12-10-2009') + 1
对于 Oracle,您必须使用该TO_DATE
功能;MySQL会使用类似的东西STR_TO_DATE
,等等。
有一列只有日期部分(时间为 00:00:00.000),然后您可以添加 where 子句:WHERE dt = '2009-11-27'