日期时间解释问题

时间:2013-10-09 21:44:24

标签: sql

我有以下数据:

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

那我为什么会遇到这个问题呢?我该如何解决?

2 个答案:

答案 0 :(得分:1)

如果您使用MS Access运行查询,则需要使用#符号分隔日期,即:#12/31/2008#。如果由于某种原因这不起作用,最好使用'yyyy-mm-dd'格式的字符串日期,因为它将被识别并且是明确的。

你可能会遇到这个问题,因为MS是一家美国公司,美国使用的是mm / dd / yyyy格式,所以MS已经默认大部分旧软件,如果可能的话,将日期视为这种格式,而你可能在一个使用的国家 - 并且你的PC的地点设置使用 - dd / mm / yyy格式。由于并非所有MS'软件都遵循此规则,因此您遇到此问题。

解决方案是使用明确的字符串日期格式,例如:yyyy-mm-ddmmm/dd/yyyydd/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)