Страницы

Поиск по вопросам

четверг, 5 марта 2020 г.

Преобразование TIMESTAMP WITH TIME ZONE в Oracle 12c

#sql #oracle #timezone


По каким-то причинам не получается правильно преобразовать TIMESTAMP WITH TIMEZONE
из одной временной зоны в другую, пример:

SELECT SYSTIMESTAMP,
       DBTIMEZONE,
       CURRENT_TIMESTAMP
       SESSIONTIMEZONE
  FROM DUAL;




=============================================================================================================================================================================================================
|                   SYSTIMESTAMP                   |                    DBTIMEZONE
                   |                CURRENT_TIMESTAMP                 |           
     SESSIONTIMEZONE                  |
=============================================================================================================================================================================================================
|            20.07.2017 7:15:33 -04:00             |                  Europe/Moscow
                  |            20.07.2017 14:15:33 +03:00            |            
         +03:00                      |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------




Второй пример:

SELECT 
  SYSTIMESTAMP,
  SYSTIMESTAMP AT TIME ZONE 'Europe/Moscow' Moscow,
  SYSTIMESTAMP AT TIME ZONE 'America/New_York' New_York
  FROM DUAL




==========================================================================================================================================================
|                   SYSTIMESTAMP                   |                      MOSCOW
                     |                     NEW_YORK                     |
==========================================================================================================================================================
|            20.07.2017 7:09:25 -04:00             |            20.07.2017 11:09:25
+00:00            |            20.07.2017 11:09:25 +00:00            |
----------------------------------------------------------------------------------------------------------------------------------------------------------


В данном случае в результате преобразования часовой пояс вообще сбросился, не смотря
на успешное выполнение преобразования.


Почему в первом примере результат CURRENT_TIMESTAMP отстает на час от реального,
которое должно быть равно 15:15:33, а не 14:15:33?
Почему во втором примере, не смотря на успешное выполнение команды, конвертация не
происходит? Может какие-то параметры базы данных не настроены, или я не понимаю как
AT TIME ZONE работает? Наименования временных зон я брал из V$TIMEZONE_NAMES.


Версия БД: Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production

UPD:
Данные из nls_session_parameters

SQL Developer

NLS_LANGUAGE    RUSSIAN
NLS_TERRITORY   RUSSIA
NLS_CURRENCY    ₽
NLS_ISO_CURRENCY    RUSSIA
NLS_NUMERIC_CHARACTERS  , 
NLS_CALENDAR    GREGORIAN
NLS_DATE_FORMAT DD.MM.RR
NLS_DATE_LANGUAGE   RUSSIAN
NLS_SORT    RUSSIAN
NLS_TIME_FORMAT HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT    DD.MM.RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT  HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD.MM.RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY   ₽
NLS_COMP    BINARY
NLS_LENGTH_SEMANTICS    BYTE
NLS_NCHAR_CONV_EXCP FALSE


dbForge

NLS_LANGUAGE    AMERICAN
NLS_TERRITORY   AMERICA
NLS_CURRENCY    $
NLS_ISO_CURRENCY    AMERICA
NLS_NUMERIC_CHARACTERS  .,
NLS_CALENDAR    GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE   AMERICAN
NLS_SORT    BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT  HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY   $
NLS_COMP    BINARY
NLS_LENGTH_SEMANTICS    CHAR
NLS_NCHAR_CONV_EXCP FALSE

    


Ответы

Ответ 1



К 1-ой части вопроса SYSTIMESTAMP возвращает текущее время и часовой пояс операционной системы машины на которой установлен сервер БД. CURRENT_TIMESTAMP возвращает эти же данные учитывая часовой пояс сессии на клиенте, который определяется клиентом из окружения (установки региона на ОС, переменные) в котором он запущен и может быть изменён непосредственно: setenv ORA_SDTZ="Europe/Moscow" или alter session set time_zone='+03:00'. Посмотреть часовой пояс сессии можно так: select sessiontimezone from dual; В примере разница между Москвой и Нью-Йорком составляет -4 и +3 = 7 часов, что соответствует действительности. Значит время, которое возвращает SYSTIMESTAMP тоже с отставанием, т.е. системное время установленно не верно. Ко 2-ой части вопроса Преобразование даты и времени производится на стороне клиента и зависит от его NLS настроек, часового пояса (см. выше), которые можно посмотреть: select * from nls_session_parameters; Некоторые клиенты, как в данном примере с dbForge\IDEA "потерялся" часовой пояс, или sqlplus не учитывает изменения часового пояса в России с октября 2014 года, выполняют преобразование не всегда верно. Поэтому при сомнении имеет смысл выполнить запрос на различных клиентах. На заметку не в рамках вопроса Oracle рекомендует устанавливать DBTIMEZONE на UTC, если не используются по каким-то специфическим соображениям тип данных TIMESTAMP WITH LOCAL TIME ZONE.

Анимация на css 3 [закрыт]

#css #css3


        
             
                
                    
                        
                            Закрыт. Этот вопрос необходимо уточнить или дополнить
подробностями. Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Добавьте больше подробностей
и уточните проблему, отредактировав это сообщение.
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        
Добрый день, подскажите пожалуйста, как сделать бесконечную анимацию на css 3

Нужно, что бы картинки плавно исчезали и появлялись, что бы первая картина быстрее появлялась и исчезала, чем вторая. Без js.


Ответы

Ответ 1



img { position: absolute; animation: blink 5s linear infinite; } img + img { animation-duration: 10s; } @keyframes blink { 0% { opacity: 1 } 50% { opacity: 0 } 100% { opacity: 1 } }

Как получит HWND окна при наведении на него курсора мыши?

#cpp #qt #winapi


Как получить HWND окна при наведении на него курсора мыши С++ WinApi32 или Qt?
    


Ответы

Ответ 1



Функция HWNDWindowFromPoint(POINT Point) поможет вам.

Печать и обновление графика в реальном времени OxyPlot - Windows Form

#c_sharp #net #winforms #oxyplot


Пишу академическую программу - монитор частоты. Для печати графиков использую Nuget
Oxylot. Не могу понять как мне напечатать график в реальном времени. Например изменения
раз в секунду. По оси X должно быть время, по оси Y - значение double, изменяющееся
от 0 до 50.00 единиц (частота в Гц). Взял семпл из документации, а как туда значение
вставить и обновлять по времени не понимаю...
Вот класс графика:

 public class Plotter
{
    private PlotModel model;
    private DateTime startDate = DateTime.Now.AddDays(-10);
    private DateTime endDate = DateTime.Now;

    private readonly List colors = new List
                                        {
                                            OxyColors.Green,
                                            OxyColors.IndianRed,
                                            OxyColors.Coral,
                                            OxyColors.Chartreuse,
                                            OxyColors.Azure
                                        };

    private readonly List markerTypes = new List
                                               {
                                                   MarkerType.Plus,
                                                   MarkerType.Star,
                                                   MarkerType.Diamond,
                                                   MarkerType.Triangle,
                                                   MarkerType.Cross
                                               };



    public Plotter()
    {
        model = new PlotModel { Title = "DateTimeAxis" };
    }


    public PlotModel PrintChart()
    {
        var minValue = DateTimeAxis.ToDouble(startDate);
        var maxValue = DateTimeAxis.ToDouble(endDate);
        model.Axes.Add(new DateTimeAxis { Position = AxisPosition.Bottom, Minimum
= minValue, Maximum = maxValue, StringFormat = "HH:mm" });
        return model;
    }}


В основном окошке:

public void PrintChart()
    {
        Plotter pt = new Plotter();
        frGraph.Model = pt.PrintChart();
    }


По событию кнопки разрешаю печать:

private void startDrawing_Click(object sender, EventArgs e)
    {
       PrintChart();
    }


И по таймеру пытаюсь обновлять (не уверен, что делаю правильно..)

 private void InitializeTimerForChart()
    {
        tickCount.Interval = References.TIMER_INTERVAL; // (1000 мс)
        this.tickCount.Tick += new System.EventHandler(this.tickCount_Tick);
        tickCount.Enabled = true;
    }
private void tickCount_Tick(object sender, EventArgs e)
    {
        if (InvokeRequired)
        {
            Invoke((MethodInvoker)delegate ()
            {
                frGraph.Invalidate();//PrintChart();
            });
        }
    }


На данный момент класс просто показывает на форме модель с осями, на оси Y текущее время.

    


Ответы

Ответ 1



В общем получилось создать линейный график без обновлений. Обновлять буду также через таймер раз в секунду. public PlotModel PrintChart() { var minValue = DateTimeAxis.ToDouble(startDate); var maxValue = DateTimeAxis.ToDouble(endDate); model.Axes.Add(new DateTimeAxis { Position = AxisPosition.Bottom, Minimum = minValue, Maximum = maxValue, StringFormat = "HH:mm" }); var leftAxisY = new LinearAxis { Position = AxisPosition.Left }; model.Axes.Add(leftAxisY); var lineSeries = new LineSeries { Title = "Линейный график", StrokeThickness = 3, LineStyle = LineStyle.Automatic, MarkerType = MarkerType.Circle, MarkerSize = 5, MarkerStroke = OxyColors.White, MarkerFill = OxyColors.Automatic, MarkerStrokeThickness = 1.5, }; for (int i = 0; i < 50; i++) { lineSeries.Points.Add(new DataPoint(minValue, i)); } model.Series.Add(lineSeries); return model; }

Ответ 2



Отвечу, может кому-то понадобится. Когда добавляете серию в график, используйте свойство series.ItemSource private void AddSeries(string Name, OxyColor Color, string AxisKey, List Buffer) { var series = new LineSeries(); series.Title = Name; series.Color = Color; series.YAxisKey = AxisKey; series.ItemsSource = Buffer; Model.Series.Add(series); } Buffer здесь это коллекция данных, в который вы будете складывать собираемые точки. Обновлять следующим образом: Buffer.Add(new DataPoint(x, y)); // здесь можете делать с коллекцией что // хотите: удалять, добавлять, очищать Model.InvalidatePlot(true); Да, тип таймера имеет значение: Threading.Timer каждый обратный вызов запускает в новом потоке, DispatcherTimer в потоке диспетчера (для простых задач наиболее удобен, косяков меньше)

Плиточный дизайн

#html #css


При верстке psd наткнулся на плиточный дизайн. Мне нужно понять что использовать:
flexbox, grid, div или таблицы использовать фреймворки нельзя только чистый css. В
какую сторону копать и если можно привести пример. 
    


Ответы

Ответ 1



Лучше используй Bootstrap Grid:она полностью реализует все твои потребности, если использовать фиксированный маргинг (вот пример) Прочитать подробнее про Bootstrap можно тут. Прочитать подробнее про Bootstrap Grid можно тут.

Ответ 2



Есть такой плагин - isotope. С его помощью можно получить очень похожую верстку в режиме masonry.

preg_replace заменить в строке символы, а цифры оставить

#php #регулярные_выражения


Есть строка в php допустим $str = 'z1.z2.z3.z6'
Как привести её к такому виду '[f1][f2][f3][f6]' через регулярку используя preg_replace ???
То есть везде заменить z на f, но соответствующие числа оставить и заключить выражение
в квадратные скобки.
    


Ответы

Ответ 1



$str = 'z1.z2.z3.z6'; echo preg_replace('/z(\d+)(.|$)/i', '[f${1}]', $str);

Ответ 2



Ещё один вариант $string = 'z1.z2.z3.z6'; $symbol = 'f'; // Символ для замены $pattern = ['~\w(\d)~', '~(?<=^|\.)~', '~(?=\.|$)~', '~\.~']; $replace = [$symbol .'$1', '[', ']', '']; echo preg_replace($pattern, $replace, $string); // Результат: [f1][f2][f3][f6]

Entity (сущности) — зачем они нужны?

#java #ооп #java_ee #entity


Всем добрый вечер.

В ходе одного обучающего проекта наткнулся на необходимость использовать Entity (сущность).
В данном случае, существует 3 класса, наследуемые друг от друга:

Entity.java:

public class BaseEntity {
    protected Integer id;

    public BaseEntity() {
    }

    protected BaseEntity(Integer id) {
        this.id = id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public boolean isNew() {
        return (this.id == null);
    }

    @Override
    public String toString() {
        return String.format("Entity %s (%s)", getClass().getName(), getId());
    }
}


От него наследуется NamedEntity:

public class NamedEntity extends BaseEntity {

    protected String name;

    public NamedEntity() {
    }

    protected NamedEntity(Integer id, String name) {
        super(id);
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    @Override
    public String toString() {
        return String.format("Entity %s (%s, '%s')", getClass().getName(), id, name);
    }
}


А от него — User:

import java.util.Date;
import java.util.EnumSet;
import java.util.Set;

import static MealsUtil.DEFAULT_CALORIES_PER_DAY;

public class User extends NamedEntity {

    private String email;

    private String password;

    private boolean enabled = true;

    private Date registered = new Date();

    private Set roles;

    private int caloriesPerDay = DEFAULT_CALORIES_PER_DAY;

    public User() {
    }

    public User(Integer id, String name, String email, String password, Role role,
Role... roles) {
        this(id, name, email, password, DEFAULT_CALORIES_PER_DAY, true, EnumSet.of(role,
roles));
    }

    public User(Integer id, String name, String email, String password, int caloriesPerDay,
boolean enabled, Set roles) {
        super(id, name);
        this.email = email;
        this.password = password;
        this.caloriesPerDay = caloriesPerDay;
        this.enabled = enabled;
        this.roles = roles;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getRegistered() {
        return registered;
    }

    public void setRegistered(Date registered) {
        this.registered = registered;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public int getCaloriesPerDay() {
        return caloriesPerDay;
    }

    public void setCaloriesPerDay(int caloriesPerDay) {
        this.caloriesPerDay = caloriesPerDay;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public Set getRoles() {
        return roles;
    }

    public String getPassword() {
        return password;
    }

    @Override
    public String toString() {
        return "User (" +
                "id=" + id +
                ", email=" + email +
                ", name=" + name +
                ", enabled=" + enabled +
                ", roles=" + roles +
                ", caloriesPerDay=" + caloriesPerDay +
                ')';
    }
}


Я не совсем понимаю смысл такой "матрёшки". Внятного объяснения на русском не обнаружил.
Прошу поделиться смыслом сущностей, особенно меня интересует, почему мы пишем отдельно
id, отдельно name, отдельно всё остальное. Объяснение нужно прямо для чайников, а именно,
почему мы не можем без них обойтись или почему лучше их использовать. Также, подойдут
русскоязычные ресурсы, на которых разжёвывают, почему мы должны пользоваться сущностями
и вообще для чего они.
    


Ответы

Ответ 1



Решить каким образом использовать сущности и использовать ли их вообще поможет понимание следующей модели представления даннных. Когда мы говорим о сущностях в абстрактном смысле мы всегда в том или ином виде подразумеваем использование какой-либо модели данных. В частности, в программировании применяется EER-модель (Enhanced Entity-Relationship model). Расширенная модель включает все концепции ER-модели (entity-relationship model) и дополнительно включает понятия подкласса, суперкласса и относящиеся к ним понятия специализации, обобщения и категоризации. Далее рассмотрим базовую ER-модель. "Набор данных, обычно относящихся к какой-либо предметной области или тематической области, и структурированных таким образом, чтобы обеспечить установление отношений между отдельными элементами данных в соответствии с различными потребностями пользователей." G. Knott & N. Waites, Computing 3rd edition ER-модель, модель «сущность — связь» Модель была предложена в в 70-х годах Питером Пин-Шэн Ченом (сайт, статья). Модель "сущность-связь" основывается на некой важной семантической информации о реальном мире и предназначена для логического представления данных. Она определяет значения данных в контексте их взаимосвязи с другими данными. Важным для нас является тот факт, что из модели "сущность-связь" могут быть порождены все существующие модели данных (иерархическая, сетевая, реляционная, объектная), поэтому она является наиболее общей. Сущность фактически представляет из себя множество атрибутов, которые описывают свойства всех членов данного набора сущностей. Например, как у вас в коде. Есть базовая сущность BaseEntity, именованная сущность NamedEntity и конкретная User(пользователь). Таким образом сущность - это объект, который может быть идентифицирован неким способом, отличающим его от других объектов. Преимущества использования ER-модели Высокая гибкость. Обеспечивают: модульность, что позволяет переиспользовать код следуя принципу DRY; простоту рефакторинга Местная автономия. В каждой отдельной части программы можно работать только с нужными нам сущностями. Простота понимания. За счет семантического моделирования данных, при котором отдельная сущность опирается на смысл этих данных. Любую модель легко изобразить в виде диаграммы. Наличие и простота визуализации. Нотация П. Чена, Crow’s Foot, UML, DFD, IDEF0 и IDEF1x, нотация Мартина, нотация Бахмана и др. Недостатки использования ER-модели Сложность. Модель предназначена для высокого уровня абстракции. Увеличивается объем и сложность кодирования. Вам пришлось создать 3 класса со своими полями и методами, хотя можно было бы их оформить в одном классе. Кроме того разработчикам достаточно сложно хранить всю иерархию классов в голове. Безопасность. Трудно контролировать уровни доступности атрибутов сущности. Трудно поддерживать целостность. Такая модель чувствительна к изменению атрбутов.