2015-11-07 148 views
-1

根据我以前的问题VB.net SQL statement to query 1 yr old Timestamp,我的SQl查询回顾一年的记录将停止一半,并出现以下错误:Select Error: ORA-01830: date format picture ends before converting entire input stringVB.net从DateTime.Now.ToString减去1年

因此,我决定对从当前日期起不超过一年的行执行不同的路由。

要做到这一点,我会在VB.net下面的SELECT语句:

Dim strSearch As String = "Select timestampVal from table_name WHERE timestampVal > " & minusYear & " order by timestampVal DESC" 

对于我minusYear变量在我的SELECT语句中,我将首先拉动下面的当前日期字符串:

Dim sign As String = DateTime.Now.ToString("yyyyMMdd-hhmmss") 

但是,要得到minusYear我需要以某种方式减去从sign一年。我想试试Dim minusYear As String = DateTime.Now.AddYears(-1);但它的格式如此MM\DD\YYYY HH:MI:SS PM这将不起作用,因为我需要查询字符串看起来像yyyyMMdd-hhmmss

有没有办法简单地从我的符号字符串减去1年?我尝试,但当然有数据类型的问题,并将字符串转换为CInt并不真正的工作。

如果我能得到1年的减号获得minusYear,那么我的select语句的作品[我已经在SQL测试它,以便通过这种方式将工作,我只需要获得sign's值减去同期】

回答

1

这是一种代码嗅觉,在应用层而不是SQL上进行操作。如果可以的话,我会在第一个问题上坚持一点(我会在下面看一看)。但与此同时,要做到这一点在VB.NET ...

Dim sign As String = DateAdd(DateInterval.Year, -1, Now()).ToString("yyyyMMdd-hhmmss") 
+0

我在看到您对字符串格式的评论后更新了内容。这现在就像你想要的那样格式化它。但是,这又是一种代码味道。你不应该建立SQL查询字符串。如果您创建一个参数化查询并将参数作为日期时间而不是字符串传入,那么您不必担心日期的格式。 –

+0

这是我想要的。谢谢。问题是数据库是在我处理应用程序之前预先创建的。该应用程序在日期列中有超过1000个信息,因此;我必须处理已实施的信息。他们都看起来像他们遵循相同的格式;然而,当我尝试在这里执行此操作时,数据库标志会阻止我使用上面提到的错误。据说,我知道在VB.net中应用查询并没有标记错误。所以即使我更喜欢在数据库中执行查询,我也无法绕过错误。再一次感谢你! – narue1992

2

有几件事情:

  • 在.NET中,格式字符串是区分大小写的。您已指定hh,这是12小时制的小时数。你可能意味着HH在24小时的时间内连续工作数小时。

  • 使用DateTime.Now.AddYear(-1)减去一年要容易得多,但请记住DateTime.Now位于服务器的本地时区。在很多情况下,这本身就是一个问题。根据您的数据,您可能会考虑使用DateTime.UtcNow或可能使用TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz)转换为特定时区,而不是依赖服务器的时区设置。

  • 真的,你不应该在数据库中存储日期或时间varchar。在oracle中使用TIMESTAMP字段。所有的格式化问题都源于此。创建一个新列,迁移数据,更新您的使用情况并删除旧列。

  • 您也不应该通过字符串连接传递参数。这通常对性能不利(防止缓存执行计划),并且有时可能是make your code vulnerable to SQL Injection attacks

  • 当你使用pass parameters properly on the .NET side,而不是将它们嵌入字符串中时,字符串表示格式变得不相关。

  • 除非您的应用程序层中有特定的东西需要考虑,否则真的不应该这样做。相反,使用数据库中的函数来计算当前时间并在那里减去一年。将当前时间作为参数发送到数据库毫无意义,因为您的数据库本身可以做到这一点。