如何比较SQL Server中的日期?

时间:2013-12-11 03:35:05

标签: sql sql-server

我的表格中有一行日期列:

date1 = 2013-12-11 00:00:00.000

我想将它与日期进行比较:

date2 = 11.12.2013 0:00:00

我做:

SELECT *
FROM ServiceOrder 
WHERE CreateDateTime <= '11.12.2013 0:00:00'

我期待结果我得到date1但我得不到它。

如何正确比较这些日期?

更新

我试过了:

SELECT *
FROM ServiceOrder 
WHERE CreateDateTime<= CONVERT(VARCHAR(23),'11.12.2013 0:00:00', 121)

但结果相同。

UPDATE2

SELECT *
FROM ServiceOrder 
WHERE CreateDateTime <= REPLACE(CONVERT(VARCHAR(19),'11.12.2013', 111),'/','-')

也不起作用。

UPDATE3

SELECT *
FROM ServiceOrder 
WHERE CreateDateTime <= CONVERT(datetime,'11.12.2013 0:00:00', 104)

也不起作用。

3 个答案:

答案 0 :(得分:1)

使用它。您需要将字符串转换为日期时间以进行正确比较。并且在这里使用正确的格式编号104

SELECT *
FROM ServiceOrder 
WHERE CreateDateTime<=CONVERT(datetime,'11.12.2013 0:00:00', 104)

更好的做法是获取变量并在查询中使用它而不是在查询中转换它们。喜欢这个

Declare @CompareDate as DateTime
SET @CompareDate=CONVERT(datetime,'11.12.2013 0:00:00', 104)

    SELECT *
    FROM ServiceOrder 
    WHERE CreateDateTime<=@CompareDate

答案 1 :(得分:1)

你应该坚持使用相同的日期时间常数格式。

查看 SET DATEFORMAT

设置解释日期,smalldatetime,datetime,datetime2和datetimeoffset字符串的月,日和年日期部分的顺序。

http://technet.microsoft.com/en-us/library/ms189491.aspx

默认格式为月,日,年。

TSQL足够聪明,知道date1不是默认格式,因为2013年不能是一个月。因此它将其解释为2013年12月11日。

日期2使月份和日期都在可接受的范围内。因此,您将获得2013年11月12日。因此,您的TSQL语句中的where子句不会返回任何内容。

在此页面上检查一半,它以数字和字母数字格式显示日期时间的可接受文字字符串。

http://technet.microsoft.com/en-us/library/ms187819.aspx

让我们用一点测试程序来解决这个问题。简单的表,第11天的三个月(OCT,NOV,DEC)。它只返回一个小于2013年11月10日的日期。正确答案。

-- use temp db
use tempdb;
go

-- simple test table
create table my_test
( my_date datetime );

-- add 3 rows
insert into my_test values ('2013-12-11 00:00:00.000');
insert into my_test values ('2013-11-11 00:00:00.000');
insert into my_test values ('2013-10-11 00:00:00.000');

-- show the data
select * from my_test;

-- just show october
select * from my_test where my_date < '2013-11-10';

enter image description here

我希望这可以帮助你。

答案 2 :(得分:0)

因此,转换格式有点棘手,因为它太具体了,ms sql没有简单的日期格式功能。所以这是一种转换整个日期的方法:

SELECT *
  FROM ServiceOrder 
 WHERE CreateDateTime <= (
                         select convert(datetime, 
                          concat(y,'-',m,'-',d,' ',h), 20) as dtConverted
                         from ( select substring(dt,1,2) d,
                                       substring(dt,4,2) m,
                                       substring(dt,7,4) y,
                                       substring(dt,12,10) h
                                  from (select 
                                         '11.12.2013 13:00:00' dt) as value
                               ) as convDate
                        )

只需转换为没有时间的日期即可:

SELECT *
  FROM ServiceOrder 
 WHERE convert(date, CreateDateTime , 104) <= convert(date, 
                               substring('11.12.2013 0:00:00',1,10), 104 )

在这里查看小提琴:http://sqlfiddle.com/#!6/3787b/1