Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос с бородой: обрезание времени у дат :)
|
|||
|---|---|---|---|
|
#18+
Уважаемые господа SQL профи! Осмелюсь задать вопрос, с которым наверняка все сталкивались, но вот мне не очень ясен на него ответ. Банальнейшая ситуация: в одной из таблиц есть поле типа, ну скажем, smalldatetime. Сервер не умеет хранить дату "в отрыве" от времени, а клиентам чаще всего время-то и не нужно. Т.е. наша задача получить в запросе каким-то обрезанием/преобразованием "чистаа дату", без часов/минут/секунд. Варианты с неиспользованием полей типа (small)datetime не очень катят, ибо часто бывает, что работаешь не со своей, созданной "по своему образу и подобию" базой, а уже с имеющейся с незапамятных времен. Пошастав тут на конфе, наткнулся на пару способов, но все они какие-то некошерные: 1. SELECT Cast( Cast( ПолеТипаДаты as int) as DateTime ) В чем тут лажа: declare @dt smalldatetime set @dt = '2001.01.01 20:00' SELECT Cast( Cast( @dt as int) as DateTime ) Округление, блин... 2. Convert(datetime, convert(char(8 ), ПолеТипаДата, 2)) Тут уже может случиться лажа с настройками set dateformat, ибо от него тут преобразрование все-таки зависит, поскольку сначала мы конвертим в строку по жестко заданному нами формату, а потом обратно отдаем все на откуп тому, который установлен на серваке. А хотелось бы получить железобетонный способ, гарантирующий правильную и однозначную интерпретацию даты в символьную строку и обратно. Единственный способ, сразу приходящий в голову, это Cast(DateName(Day, dt) + ' ' + DateName(Month, dt) + ' ' + DateName(Year, dt) as smalldatetime) Тут фишка в том, что "вумный" сервер не спутает день с месяцем по причине написания второго "в словесной форме". Но уж больно многословное получилось преобразование... Кто как приводит дату "в божеский вид"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2002, 11:50 |
|
||
|
Вопрос с бородой: обрезание времени у дат :)
|
|||
|---|---|---|---|
|
#18+
declare @dt smalldatetime set @dt = '20010228 20:00' set dateformat dmy SELECT Convert(datetime, convert(char(8 ), @dt, 2)), @dt, Convert(datetime, convert(char(8 ), @dt, 112 )) PS И вообще символьное представлении даты в виде yyyymmdd hh:mm:ss ВСЕГДА интерпретировалось сервером в правльную дату независимо от региональных установок клиента и сервера (по крайней мере на моей памяти) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2002, 12:07 |
|
||
|
Вопрос с бородой: обрезание времени у дат :)
|
|||
|---|---|---|---|
|
#18+
SELECT Cast( FLOOR( cast(@dt as float)) as DateTime ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2002, 14:09 |
|
||
|
Вопрос с бородой: обрезание времени у дат :)
|
|||
|---|---|---|---|
|
#18+
(ничего не понимаю) а это разве не работает: convert(char(10),ВашаДата,104) ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2002, 07:39 |
|
||
|
Вопрос с бородой: обрезание времени у дат :)
|
|||
|---|---|---|---|
|
#18+
А что мешает исп-ть типы DATE и TIME? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2002, 18:46 |
|
||
|
Вопрос с бородой: обрезание времени у дат :)
|
|||
|---|---|---|---|
|
#18+
их отсутствие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2002, 06:34 |
|
||
|
Вопрос с бородой: обрезание времени у дат :)
|
|||
|---|---|---|---|
|
#18+
Самый загадочный для меня постинг!!! Чем плохо: convert(char(10),ВашаДата,104) и наоборот: convert(smalldatetime,ВашеПолеТипаChar(10),104) ??? И причем здесь региональные настройки ??? Короче, объясните или кончайте шутки шутить!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2002, 10:58 |
|
||
|
Вопрос с бородой: обрезание времени у дат :)
|
|||
|---|---|---|---|
|
#18+
2RatTail declare @dt char(10) set @dt = '20010131' select convert(smalldatetime, @dt, 104) GO declare @dt char(10) set @dt = '2001.01.31' select convert(smalldatetime, @dt, 104) GO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2002, 13:16 |
|
||
|
Вопрос с бородой: обрезание времени у дат :)
|
|||
|---|---|---|---|
|
#18+
2Glory В первом случае вообще не надо указывать стиль. Стиль 104 предполагает написание: 17.04.2002, а не 2001.01.31 В чем задача? Написать 2002.02.03 и заставить сервер ДОГАДАТЬСЯ, что речь идёт о 2 марта, а не о 3 февраля(или наоборот)??????????????????????????? Это слишком круто для моего Крысиного Хвоста... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2002, 06:15 |
|
||
|
Вопрос с бородой: обрезание времени у дат :)
|
|||
|---|---|---|---|
|
#18+
2SergSuper Виноват, добавим Еще пожелания? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2002, 11:11 |
|
||
|
|

start [/forum/topic.php?fid=46&gotonew=1&tid=1823061]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
111ms |
get topic data: |
14ms |
get first new msg: |
7ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 271ms |
| total: | 517ms |

| 0 / 0 |
