2014-02-12 20 views
-1

嘿我在我的where子句中运行SQL服务器&我有大约6个不同日期范围的这些条件。 dateadd函数工作得很好,对我而言可能太好了。我缺少记录,因为在数据库中,如果记录的时间戳超过当前运行时间,它不会被捕获。我可以指定我的日期范围(27-33)天,并说今天上午12点开始而不是当前时间?我如何从指定日期的12点开始获取记录?

即:属于2014年3月11日的记录符合27天范围。但它实际上在DB内

2014年3月11日4:00:00哪些不会检索bc它在凌晨4点以后。

+ "where " 
+ "(b.new_SwWarrantyEndDate >= dateadd(day,27,(CONVERT (date, SYSUTCDATETIME()))) AND " 
+ "b.new_SwWarrantyEndDate <= dateadd(day,33,(CONVERT (date, SYSUTCDATETIME())))) OR " 
+0

日期和DB比较值是我的存在的祸根。首先,让我说通过MS JDBC驱动程序使用类似'dateadd()'的函数可能会造成严重破坏。 SQL运行的方式与通过Studio Management客户端运行的方式不同。它导致了一个非常无害的SQL语句来打败我的Prod环境,因为计划优化器的工作方式不同,所以要小心。对于你的问题,你需要做的是将时间部分放到'00:00:00.000'。有一些方法可以在SQL中使用'dateadd()'来实现,但我建议将它移动到Java代码中。 – CodeChimp

+0

或简单地'CAST(字段AS日期)' –

回答

0

可以检索使用DATE_FORMAT日期的范围之间的数据和BETWEEN关键字:

DATE_FORMAT(b.new_SwWarrantyEndDate, '%Y-%间 - %d')之间DATE_FORMAT('” + + DATE1 “','%Y-%m-%d') 和DATE_FORMAT(''+ date2 +'','%Y-%m-%d')

它可以帮助你。

+0

感谢您的建议,它的代码是巨大的我试图尽量减少Java的负担和使用尽可能多的SQL服务器......日期格式和其他有关放下小时和秒钟的声音,我会在上午10点前报告。 EST – Bgreen

+0

伙计们我有限的互联网接入,但我刚刚阅读,秘密采取可选的第三个参数,应该给我什么样式我想要的日期,我会尽快更新 – Bgreen

0

可以计算在Java方面timstamps

Calendar c = Calendar.getInstance(); 
    c.set(Calendar.MILLISECOND, 0); 
    c.set(Calendar.SECOND, 0); 
    c.set(Calendar.MINUTE, 0); 
    c.set(Calendar.HOUR_OF_DAY, 12); 
    c.add(Calendar.DATE, 27); 
    Timestamp ts1 = new Timestamp(c.getTimeInMillis()); 
    c.add(Calendar.DATE, 6); 
    Timestamp ts2 = new Timestamp(c.getTimeInMillis()); 

,然后把它们作为参数的PreparedStatement

...b.new_SwWarrantyEndDate between ? and ? 

ps.setTimestamp(1, ts1); 
ps.setTimestamp(2, ts2); 
0

您可以将您的过滤器(WHERE子句)两个:

在首先按日期获取所有数据:

CAST(b.new_SwWarrantyEndDate as date) BETWEEN dateadd(day,27,(CONVERT (date, SYSUTCDATETIME()))) AND dateadd(day,33,(CONVERT (date, SYSUTCDATETIME())))

然后通过时间

CAST(b.new_SwWarrantyEndDate as time) BETWEEN '12:00:00' and '23:59:59' 
0

开始12:00AAM换句话说时间是irelevant和您所关心的是,只要日期是相同的。 在这种情况下,就可以把现场和GETDATE()函数的日期,然后在SQL Server类似

WHERE CAST(Field AS DATE) = CAST(GETDATE() AS DATE) 
相关问题