为啥日期不占用 2016 年 9 月 13 日

Posted

技术标签:

【中文标题】为啥日期不占用 2016 年 9 月 13 日【英文标题】:Why date is not taking 13/09/2016为什么日期不占用 2016 年 9 月 13 日 【发布时间】:2016-09-27 07:20:52 【问题描述】:

我正在检查12/09/201613/09/2016 的条件,但它没有显示13/09/2016 的数据并给出错误

将 char 数据类型转换为 datetime 数据类型导致 datetime 值超出范围。

这是我的查询

SELECT DISTINCT  
   b.mkey ,  a.N_UserMkey, cuser_id,isnull(a.N_UserMkey,cuser_id) aa,
   ISNULL(b.first_name + ' ', '')  
   + ISNULL(b.last_name, '') NAME, convert(varchar,a.U_datetime,103) Action_Date
  FROM      inward_doc_tracking_trl a  
   INNER JOIN user_mst b ON isnull(a.N_UserMkey,cuser_id) = b.mkey  
  WHERE 
  convert(datetime,a.U_datetime,103) 
    BETWEEN convert(varchar,'12/09/2016',103)
  AND convert(varchar,'13/09/2016',103)
   and b.mkey=2357

【问题讨论】:

格式化MM/DD/YYYY? @jarlh:不,我想要dd/MM/yyy 格式。我为此使用了 103 我只是猜测,由于系统的语言,它采用格式:“月/日/年”的数据。试试2016-09-13 @nad 这将是转换函数结束后的格式。但是,转换函数接收一个字符串,¿哪种格式被认为在转换函数内部解析该字符串?。转换函数分析采用系统默认日期时间格式的字符串。因此,转换函数完全有可能像@jarlh 所说的那样解析13 @nad CONVERT(data_type(length),expression,style) 中的 style 属性仅适用于日期或时间数据类型。 msdn.microsoft.com/en-us/library/ms187928.aspx 【参考方案1】:

我不确定,但您似乎在这里累积了几个错误:

不要检查带有BETWEEN 的日期范围。由于日期时间的时间部分,这是非常错误的。经常被遗忘...你可能会read this great blog by Aaron Betrand 切勿在文化特定格式中使用文字日期。你可以read this (and other answers there) 始终以所需类型比较数据。您将日期转换为字符串只是为了比较它们字母数字? 在convert(varchar,'12/09/2016',103) 中,您使用的varchar 没有长度...One more bad habit to kick

尝试将您的 WHERE 子句更改为此(所有日期时间均为 9 月 12 日,但不是 13 日)

WHERE a.U_datetime >= d'2016-09-12' AND a.U_datetime<d'2016-09-13'

或者这个(9 月 12 日和 13 日的所有日期时间)

WHERE a.U_datetime >= d'2016-09-12' AND a.U_datetime<d'2016-09-14'

【讨论】:

我应该使用哪一个,第一个还是第二个..我很困惑 @nad 抱歉,convert 太多了...查看我的更新 这里的d 是什么?? @nad。这是ODBC-格式。查找详细信息 here 和 here。 链接上的精彩解释。谢谢,会更正并通知您【参考方案2】:

您需要转换为 DATETIME

...
BETWEEN convert(datetime,'12/09/2016',103)
  AND convert(datetime,'13/09/2016',103)

当前查询只将 BETWEEN 参数保留为 VARCHAR,然后服务器需要将它们与 convert(datetime,a.U_datetime,103) 进行比较。在那一刻,它们被转换为 DATETIME,但没有指定格式。

【讨论】:

@Shnugo 只需记住 BETWEEN 包含 (>= , 不是真的...午夜之前和之后的最后时刻可能是个问题...使用BETWEEN d'2016-09-17' AND d'2016-09-18'包含准确的午夜 + 微小时间的记录下一个 天,而BETWEEN d'2016-09-17' AND ts'2016-09-17 23:59:59' 可能会丢失最后一秒的记录(即使指定了毫秒...)。诚然是一个很小的问题,但没有必要......

以上是关于为啥日期不占用 2016 年 9 月 13 日的主要内容,如果未能解决你的问题,请参考以下文章

SQL 按键重复开始和结束日期

获取范围之间的日期时出现问题

老男孩教育每日一题-2017年3月21日:查找占用内存的前3名进程

excel输入日期为啥总变成数字是怎么回事?

无法在 C# 中解析“2020 年 9 月 4 日”或“2020 年 9 月 4 日”日期字符串

自定义验证规则,检查日期范围是不是已经被占用