SQL Server转换错误

Jon*_*nas 0 sql-server date

我有以下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),所以在我看来这是正确的.

谁知道什么是错的?

Pan*_*vos 6

ODBC格式使用两个数字表示月份和日期,即2015-08-29 00:00:00代替2015-8-29 00:00:00.

尽管使用日期类型的参数会更好.否则,应使用明确的日期文字,不需要任何转换,也不受排序规则的影响.

完整的ISO 8601格式不需要转换,例如:2015-08-29T00:00:00.未分离的日期格式也不需要转换,例如20150829.

如果UPLOAD_DATEdate列,则没有理由指定时间部分.查询可以写成如下:

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)