我遇到了一个非常奇怪的问题。
当我在当前年份过滤我的数据时,一切正常: 但如果我试着回去一年,我突然得到一份空白报告......
进入下一年不是问题,就像你在这里看到的那样:
我的代码是:
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的样子:
总而言之:除非我去年,否则一切正常。 如果我放置:NOT BETWEEN,一切都反转,我看到所有数据。
我尝试用> =和< =替换BETWEEN,但同样的事情发生了。
有什么想法吗?
答案 0 :(得分:1)
Aangemeld显然是一个约会,应该如此。所以你必须比较Aangemeld和日期。为了做到这一点,
datumvan.ToString("dd/MM/yyyy")
如何将字符串转换为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。