我有以下SQL查询来检索两个日期之间的账单:
SELECT *
FROM BILLS
WHERE
UPLOAD_DATE >= Convert(DATETIME, '2015-8-29 00:00:00', 120)
AND UPLOAD_DATE <= Convert(DATETIME, '2015-9-28 23:59:59', 120)
Run Code Online (Sandbox Code Playgroud)
但是,当我执行此查询时,我收到以下错误消息;
从字符串转换日期和/或时间时转换失败
我检查了格式120,语法是yyyy-mm-dd hh-mi-ss
(24h),所以在我看来这是正确的.
谁知道什么是错的?
ODBC格式使用两个数字表示月份和日期,即2015-08-29 00:00:00
代替2015-8-29 00:00:00
.
尽管使用日期类型的参数会更好.否则,应使用明确的日期文字,不需要任何转换,也不受排序规则的影响.
完整的ISO 8601格式不需要转换,例如:2015-08-29T00:00:00
.未分离的日期格式也不需要转换,例如20150829
.
如果UPLOAD_DATE
是date
列,则没有理由指定时间部分.查询可以写成如下:
declare @startDate date, @endDate date
....
Select *
From BILLS
Where UPLOAD_DATE BETWEEN @startDate AND @endDate
Run Code Online (Sandbox Code Playgroud)
如果该语句是存储过程的一部分,或者由ADO.NET调用,则这是首选方式,例如:
var startDate=new DateTime(2015,8,29);
var endDate=startDate.AddMonths(1).AddDays(-1);
var myCmd=new SqlCommand("SELECT .... Where UPLOAD_DATE BETWEEN @startDate AND @endDate");
myCmd.Parameters.Add("@startDate",startDate);
myCmd.Parameters.Add("@endDate",endDate);
....
Run Code Online (Sandbox Code Playgroud)
使用日期文字可以是相同的语句:
Select *
From BILLS
Where UPLOAD_DATE BETWEEN '20150829' AND '20150928'
Run Code Online (Sandbox Code Playgroud)
部分将只需要如果时间UPLOAD_DATE
是一个datetime
类型.但在这种情况下,更容易将条件更改为小于下一个日期:
Select *
From BILLS
Where UPLOAD_DATE >= '20150829' AND UPLOAD_DATE < '20150929'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
67 次 |
最近记录: |