SQL Filter与过去的一年没有合作

时间:2015-01-08 14:21:49

标签: sql vb.net filtering

我遇到了一个非常奇怪的问题。

当我在当前年份过滤我的数据时,一切正常: enter image description here 但如果我试着回去一年,我突然得到一份空白报告...... enter image description here

进入下一年不是问题,就像你在这里看到的那样: enter image description here

我的代码是:

These 2 values come through as a 'date' in a private sub
datumvan = DateTimePickerVan.Value.ToLocalTime
datumtot = DateTimePickerTot.Value.ToLocalTime


Dim culture As New CultureInfo("pt-BR")
sqlstr = "SELECT * FROM [Geschiedenis$] WHERE Aangemeld BETWEEN '" & datumvan.ToString("d", culture) & "' AND '" & datumtot.ToString("d", culture) & "'"

如果进入调试,请参阅sql的样子: enter image description here

总而言之:除非我去年,否则一切正常。 如果我放置:NOT BETWEEN,一切都反转,我看到所有数据。

我尝试用> =和< =替换BETWEEN,但同样的事情发生了。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

Aangemeld显然是一个约会,应该如此。所以你必须比较Aangemeld和日期。为了做到这一点,

  • 首先将日期转换为VB中的字符串。使其成为特定的日期格式,而不是依赖于某些区域设置。例如。 datumvan.ToString("dd/MM/yyyy")
  • 然后在SQL中将字符串转换为日期。再次不要依赖数据库设置,而是命名您正在使用的格式。

如何将字符串转换为SQL中的日期取决于您使用的DBMS。以下是一些例子:

MySQL的:

" ... WHERE Aangemeld BETWEEN STR_TO_DATE('" & datumvan.ToString("dd/MM/yyyy") & "','%d/%m/%Y') AND ... "

SQL_SERVER:

" ... WHERE Aangemeld BETWEEN CONVERT(datetime,'" & datumvan.ToString("dd/MM/yyyy") & "',103) AND ... "

甲骨文:

" ... WHERE Aangemeld BETWEEN TO_DATE('" & datumvan.ToString("dd/MM/yyyy") & "','dd/mm/yyyy') AND ... "

许多DBMS(例如MySQL,SQL-Server和PostgreSQL)也接受ISO格式的字符串和日期文字。

" ... WHERE Aangemeld BETWEEN '" & datumvan.ToString("yyyyMMdd") & "' AND ... "

在Oracle中,这样的文字必须以DATE开头:

" ... WHERE Aangemeld BETWEEN DATE'" & datumvan.ToString("yyyyMMdd") & "' AND ... "

还有一件事:我不知道其他DBMS是否也是如此,但我知道Oracle将没有时间的日期视为午夜的日期,因为它只知道日期时间数据类型。因此,一个条款将排除最后一天。这就是为什么在Oracle中你会比较TRUNC(Aangemeld)而不是Aangemeld。