我的表格中有一行日期列:
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)
也不起作用。
答案 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';
我希望这可以帮助你。
答案 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