sql查询按日期和时间获取数据

Posted

技术标签:

【中文标题】sql查询按日期和时间获取数据【英文标题】:sql query to get data by date and time 【发布时间】:2015-01-19 10:25:42 【问题描述】:

我想获取日期和时间大于给定日期的行。这是我的桌子:

EvDate      EvTime      ClBdg   Name    Event
18.01.2015  10:55:01    001     Jane    enter
18.01.2015  19:31:21    003     Brad    exit
19.01.2015  13:31:21    002     Lucy    exit

假设date18.01.2015time17:00:00。期望值为:

EvDate      EvTime      ClBdg   Name    Event
18.01.2015  19:31:21    003     Brad    exit
19.01.2015  13:31:21    002     Lucy    exit

谁能帮帮我?

编辑: 为了更清楚,我编辑了我的帖子。这是执行查询的java代码:

private static final SimpleDateFormat sdfTime=new SimpleDateFormat("HH:mm:ss");  
private static final SimpleDateFormat sdfDate=new SimpleDateFormat("dd.MM.yyyy");  
private long givenTimeStamp = 1421600400L;
public static Date givenDate = new Date(givenTimeStamp);

Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");  
String DATABASE = "jdbc:ucanaccess://"+CONF.getString("db.location")+";jackcessOpener=uz.lexus.access.crypto.MyCryptoProvider";  
connection= DriverManager.getConnection(DATABASE, null, null);  

List<Event> events=new ArrayList<Event>();  
String selectEvents = "select EvDate,EvTime,ClBdg,Event from Evntlog_tbl where  Event in ('enter','exit') and not ClBdg=0 and EvDate >= ? and EvTime > ?  order by EvDate desc, EvTime desc";
PreparedStatement prstm= connection.prepareStatement(selectEvent);  
java.sql.Date date=new java.sql.Date(sdfDate.parse(sdfDate.format()).getTime(givenDate));  
java.sql.Time time=new Time(sdfTime.parse(sdfTime.format(givenDate)).getTime());  

prstm.setDate(1,date);  
prstm.setTime(2,time); 

ResultSet rs = prstm.executeQuery();  

现在的问题是:selectEvent中的查询是否正确?

【问题讨论】:

你使用的是哪个数据库答案取决于它 您使用的是什么风格的 SQL(或什么具体数据库)?这些在处理这些事情的方式上都略有不同!请在您的问题中添加相关标签(如oraclepostgresqlmysqldb2sql-server 等!) EvDate & EvTime的数据类型是什么 EvDate 是日期类型,EvTime 是时间 您尝试过什么吗?如果没有,请阅读 sql server 中的WHERE 子句,这里是链接msdn.microsoft.com/en-us/library/ms188047.aspx 【参考方案1】:

试试这个, 因为EvdateEvTime 有两个不同的列

SELECT * FROM table_name WHERE EvDate >'18.01.2015'  OR (EvDate = '18.01.2015' AND EvTime > '17:00:00'

更新-

附上 fiddle 会很有帮助。

【讨论】:

@LeXuS this 可能是最佳查询(假设添加了对 datetime 的强制转换)。它确保查询优化器将使用任何底层索引。将函数应用于列会阻止优化器使用索引,尽管它通常足够聪明,可以处理一些日期操作 @LeXuS 如果您在这两个字段或字段中的任何一个上创建了索引,那么我建议您使用此查询。 @PanagiotisKanavos 我如何用 java 编写它 @Nimesh 感谢您的建议,但是在这种情况下编写查询会更复杂 @LeXuS 看看这个fiddle。 Varsha,您可以将此示例作为不同的方法添加到您的答案中。【参考方案2】:
SELECT *  
FROM table1 
WHERE EvDate + EvTime > '2015-01-18T17:00:00'

相反,您可以考虑创建一个添加日期和时间的 PERSISTED 计算列。持久化计算列将允许索引

ALTER TABLE table1 ADD cEVdatetime AS EvDate + EvTime PERSISTED 

【讨论】:

我想知道,查询优化器是否足够聪明,可以使用 EvDateEvTime 上的任何索引,或者添加会强制执行索引扫描? 如果在任何字段上创建了任何索引,那么它将被删除并且性能可能会下降。 @Nimesh 不是这样,这就是我问的原因。 SQL Server 的优化器通常能够将DATEADD 或加法操作转换为范围搜索。【参考方案3】:

这可能对你有帮助

declare @t table(a date,b time)
insert into  @t values (getdate(),'7:00:00 AM')

select * from @t
where a>'2015/01/19' or (a=getdate() and a>'6:00:00 AM')

【讨论】:

【参考方案4】:

我假设 EvDate 数据类型是 Date 并且 EvTime 数据类型是 Time 。 试试这个....

选择 * 来自你的表名 其中 CONVERT(VARCHAR(20),EvDate ,112)>=20150118 AND EvTime >='17:00:00'

【讨论】:

典型的建议是将字符串转换为正确的日期和时间,而不是相反。而且,这解决不了任何问题。问题不在于datetime 类型的(不存在的)格式,它正在检查EvTime,即使是未来的日期

以上是关于sql查询按日期和时间获取数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询按时间段到日期聚合

SQL查询获取特定日期和列中最新日期之间的数据

SQL中按日期进行查询,如何截取日期进行查询

SQL查询以获取特定年份的当前日期(考虑月份和日期)的数据

sql如何取得当前日期

SQL 按日期排序并按用户获取结果