我有以下数据:
StartDate FinishDate Details
09/10/2013 11/10/2013 xxx
14/10/2013 13/10/2014 Taking a year off
虽然编辑检查日期范围的数据I不会重叠。
我正在通过ado访问来运行SQL查询来执行此操作;我将输入的日期输入数据库格式(即'mm / dd / yyyy');这是我得到的查询:
SELECT Count(*)
FROM MarkerAbsence
WHERE PerID = 718 AND
('10/09/2013' BETWEEN StartDate AND FinishDate OR
'10/11/2013' BETWEEN StartDate AND FinishDate)
如果数据有效,则应返回零记录;但它不会返回1(上面列出的第二个记录),因此似乎将'10 / 11/2013'解释为dd / mm / yyyy而不是mm / dd / yyyy。
但如果我在SMO中这样做:
DECLARE @datevar datetime2 = '31/12/2008';
SELECT @datevar;
我明白了:
Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.
虽然
DECLARE @datevar datetime2 = '12/31/2008';
SELECT @datevar;
返回
2008-12-31 00:00:00.0000000
那我为什么会遇到这个问题呢?我该如何解决?
答案 0 :(得分:1)
如果您使用MS Access运行查询,则需要使用#
符号分隔日期,即:#12/31/2008#。如果由于某种原因这不起作用,最好使用'yyyy-mm-dd'
格式的字符串日期,因为它将被识别并且是明确的。
你可能会遇到这个问题,因为MS是一家美国公司,美国使用的是mm / dd / yyyy格式,所以MS已经默认大部分旧软件,如果可能的话,将日期视为这种格式,而你可能在一个使用的国家 - 并且你的PC的地点设置使用 - dd / mm / yyy格式。由于并非所有MS'软件都遵循此规则,因此您遇到此问题。
解决方案是使用明确的字符串日期格式,例如:yyyy-mm-dd
,mmm/dd/yyyy
或dd/mmm/yyyy
(其中mmm返回三个字母的月份,例如{{ 1}})。
答案 1 :(得分:1)
您正在使用日期字符串的dd / mm / yyyy格式。默认情况下,如果没有显式转换,SQL需要使用mm / dd / yyyy或yyyy-mm-dd格式的日期字符串。因此,要么更改字符串以匹配其中一种格式,请执行以下操作:
SELECT Count(*)
FROM MarkerAbsence
WHERE PerID = 718 AND
(CONVERT(DATETIME, '10/09/2013', 103) BETWEEN StartDate AND FinishDate OR
CONVERT(DATETIME, '10/11/2013', 103) BETWEEN StartDate AND FinishDate)