两个日期之间的SQL SELECT

时间:2014-07-31 08:49:51

标签: sql sql-server vb.net

我在尝试通过选择2个日期之间的数据来查询我的数据库时遇到了一个真正的问题。

以下是我在VB .NET项目中使用的查询。

WHERE [BuildID] > 0 AND [EndDate] BETWEEN '01/07/2014' and '31/07/2014'

日期格式设置为dd / mm / yyyy,列类型为VARCHAR(10)

当我运行此查询时,它会带回我数据库中的所有数据,基本上它会选择所有数据。

我尝试过几种方法,例如[EndDate] >= '01/07/2014' and [EndDate] <= '31/07/2014',它会带来相同的结果,它会忽略日期并带回整个数据库。

我觉得这是因为列设置为VARCHAR但我不确定。

如果有人能指出我最合适的方向。

感谢您花时间阅读本文。

5 个答案:

答案 0 :(得分:2)

  

列类型为VARCHAR(10)

要将日期视为日期,您需要将列类型设置为date(如果使用旧版本的SQL,则需要datetime

如果您无法控制列类型,则需要转换为日期,但这对于任何可调整大小的数据集都会表现不佳:

WHERE [BuildID] > 0 
AND cast([EndDate] as date) BETWEEN '2014-07-01' and '2014-07-31'

注意:我也改变了上面字符串的日期格式 - 这不是必需的,但我希望避免混淆美国和英国格式(如果您的代码由国际团队维护,则特别有用)。

答案 1 :(得分:1)

尝试yyyyMMdd格式永不失败。您还应该尝试将列转换为DATETIME

WHERE [BuildID] > 0 AND CONVERT(DATETIME,[EndDate]) BETWEEN '20140701' and '20140731'

或者如果VB中有变量,那么:

dateVar.ToString("yyyyMMdd")

答案 2 :(得分:1)

首先将列类型更改为日期,或者如果您还需要时间,请使用datetime。

然后,您可以使用T-SQL函数CONVERT将提交的值更改为正确的时间/日期时间格式。

T-SQL Convert

答案 3 :(得分:1)

请参阅 Fiddle 了解SQL Server中的日期时间格式

使用类似:

convert(varchar,EndDate,111)  BETWEEN '2014/07/01' and '2014/07/31'

因为,varchar会进行字符串比较,并且会以dd / mm / yyyy格式失败。字符串比较最适合yyyy / mm / dd(YearMonthDate)格式。

Example, as per varchar comparison,

31/01/2014 is greater than 01/02/2014
whereas,
2014/01/31 is lesser than 2014/02/01.

答案 4 :(得分:1)

始终始终使用parameterized SQL queries

Dim date1 As Date = Date.Parse("2014-07-01")
Dim date2 As Date = Date.Parse("2014-07-31")

mycmd.CommandText = ".... WHERE [BuildID] > @bid AND [EndDate] BETWEEN @firstDate AND @lastDate"
mycmd.Parameters.AddWithValue("@bid", 0I)
mycmd.Parameters.AddWithValue("@firstDate", date1)
mycmd.Parameters.AddWithValue("@lastDate", date2)