为啥日期不占用 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/2016
到13/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 日的主要内容,如果未能解决你的问题,请参考以下文章
老男孩教育每日一题-2017年3月21日:查找占用内存的前3名进程